我们写一个这样的程序:它先让我们键入尽可能多的单词(每行键入一个单词直到我们在一个空白行里敲回车),然后程序会将我们输入的单词以字母表顺序排列并输出。试试如何编写吧……
所以……首先让我们……嗯……哼……对了,我们可以……嗯……
好吧,我不认为我们现阶段可以完成这个程序。我们需要知道一种能够存储不确定数量单词的方法,还需要把它们都记录下来(这样就不会与其他变量搞混),我们还需要它们排序,因此这里就需要用到阵列的概念了。
阵列就是在你电脑中的一串列表,在列表中的每个元素都与变量类似:你能够知道每个单一元素指向哪个对象,你也可以更改元素使其指向其他不同的对象。先让我们看看下面几个阵列:
[]
[5]
['Hello', 'Goodbye']
flavor = 'vanilla' # This is not an array, of course...
[89.9, flavor, [true, false]] # ...but this is.
第1个是空阵列,然后是一个包含单个数字的阵列,然后是包含两个字符串的阵列,之后是一个简单的赋值,最后哦的是一个包含3个对象的阵列,阵列中最后一个对象是一个阵列[ true , false ].值得强调的是:变量不是对象,所以我们最后一个阵列实际上指向的分别是浮点、字符串和一个阵列。即使我们将flavor
指向其他的对象,这样也不会改变这个阵列。
为了方便我们调用/提取阵列中特定的对象,每个元素都会有相应的数字索引。程序员(及大多数数学家)会从0开始数数,所以阵列中第一个位置是0号位。下面来看看我们如何提取阵列中的对象:
names = ['Ada', 'Belle', 'Chris']
puts names
puts names[0]
puts names[1]
puts names[2]
puts names[3] # This is out of range.
可以由上看到
puts names
会将阵列names
中的每个元素都输出到屏幕;puts name[0]
输出阵列中“第1个”元素,puts name[1]
输出阵列中“第2个”元素……我肯定这看起来挺困惑的,但是你的确要适应它。你仅仅需要开始适应从0开始计数,而不是用1、2这样数数。假如你出去就餐点了5道菜,不要说第“1”道菜…而要说第“0”道菜(在头脑中认为是 道[0]);你右手由5个手指头,它们的计数是0,1,2,3,4;我妻子和我是杂耍爱好者,当我们玩6个捷克棒时计数应该是棒0--5,在接下来几个月后我们将能够玩第6个捷克棒(这样我们就能玩7个捷克棒了)。你将会从第0个开始计数zeroth
(这还真是一个存在的单词,你可以问问其他程序员和数学家)。
上面例子中我们想试验puts names[3]
会发生什么,你期望输出一个错误提示吗?有时候你向电脑提出一个没有具体意义的问题,电脑会给你输出一个错误提示,但有时你提出问题而答案会是nothing
。这上例中第3个元素是什么?Nothing, names[3]
会是什么?nil:Ruby中表示nothing的方式。nil是一个特殊对象,用来表示"没有任何对象"。当你puts nil
时,它会输出空行(只输出新的一行)。
如果以后你用到上面这种有趣的阵列元素的计数方式,不要害怕!我们可以不用上面计数方式调用对象,而采用多种多样的调用方式,好比像下面这样:
each 调用方法
each
可以让我们对阵列中每个指向的对象进行操作,因此如果我们像在阵列中说些关于每种语言的好话,我们可以:
languages = ['English', 'German', 'Ruby']
languages.each do |lang|
puts 'I love ' + lang + '!'
puts 'Don\'t you?'
end
puts 'And let\'s hear it for C++!'
puts '...'
发生了什么?好吧,我们是在调用阵列中每个对象而不需要用到任何数字和计数,这样再合适不过了!说人话来解释上面的程序是:对于在阵列languages中的每个对象,将变量lang指向这些对象,然后让阵列
do
做任何我们想让它做的事,直到运行到end
.(你只需要了解的是C++ 是另外一种计算机语言,它比Ruby语言更难以学习,通常要写同一种功用的程序,用C++语言写要比用Ruby来写的代码要长得多得多)
你可能会联想到上面的each
方法与我们之前学的loop
循环方法挺像的,很对,它们很类似,但它们一个重要的不同是each
是一个类函数的方法,而while
、end
以及do
、if
、else
等等不是方法,它们只是Ruby语言中基本组成部分,就像=
和括号一样,类似于英语中的标点符号那样。
但是对于each
来说不一样,each
仅仅是阵列中另一种方法。each
这样类似loop
循环的调用方法通常被称为迭代。
关于迭代需要单独强调的是:它们总会有do…end
在后面跟随,while
和if
从来不会在它们中有do
出现,我们只会在迭代中用到do
。
下面是另一个小的迭代,但没用到任何阵列的方法……用的是数字的方法:
3.times do
puts 'Hip-Hip-Hooray!'
end
有始有终
网友评论