你已经学过了数组。在你学习“ while
循环的时候,你对数组进行过「pushed」动作,而且将数组的内容打印了出来。另外你应该还在加分练习里研究过 Ruby 文件,看了数组支持的其他操作。这已经是一段时间以前了,所以如果你不记得了的话,就回到本书的前面再复习一遍吧。
找到了吗?还记得吗?很好。那时候你对一个数组执行了 push
函式。不过,你也许还没有真正明白发生的事情,所以我们再来看看我们可以对数组进行什么样的操作。
当你看到像 mystuff.append('hello')
这样的程序时,你事实上已经在 Ruby 内部激发了一个连锁反应。以下是它的运作原理:
- Ruby 看到你用到了
mystuff
,于是就去找到这个变量。也许它需要倒着检查看你有没有在哪里用=
建立过这个变量,或者检查它是不是一个函式参数,或者看它是不是一个全局变量。不管哪种方式,它得先找到mystuff
这个变量才行。 - 一旦它找到了
mystuff
,就轮到处理句点.
(period)这个操作符号,而且开始查看mystuff
内部的一些变量了。由于mystuff
是一个数组,Ruby 知道mystuff
支持一些函式。 - 接下来轮到了处理
push
。Ruby会将 「push」和mystuff
支持的所有函式的名称一一对比,如果确实其中有一个叫push
的函式,那么Ruby就会去使用这个函式。 - 接下来Ruby看到了括号(parenthesis)并且意识到, 「噢,原来这应该是一个函式」,到了这里,它就正常会呼叫这个函式了,不过这里的函式还要多一个参数才行。
一下子要消化这么多可能有点难度,不过我们将做几个练习,让你头脑中有一个深刻的打印象。下面的练习将字符串和列表混在一起,看看你能不能在里边找出点乐子来:
ten_things = "Apples Oranges Crows Telephone Light Sugar"
puts "Wait there's not 10 things in that list, let's fix that."
stuff = ten_things.split(' ')
more_stuff = %w(Day Night Song Frisbee Corn Banana Girl Boy)
while stuff.length != 10
next_one = more_stuff.pop()
puts "Adding: #{next_one}"
stuff.push(next_one)
puts "There's #{stuff.length} items now."
end
puts "There we go: #{stuff}"
puts "Let's do some things with stuff."
puts stuff[1]
puts stuff[-1] # whoa! fancy
puts stuff.pop()
puts stuff.join(' ') # what? cool!
puts stuff.values_at(3,5).join('#') # super stellar!
你应该看到的结果
$ ruby ex39.rb
Wait there's not 10 things in that list, let's fix that.
Adding: Boy
There's 7 items now.
Adding: Girl
There's 8 items now.
Adding: Banana
There's 9 items now.
Adding: Corn
There's 10 items now.
There we go: ["Apples", "Oranges", "Crows", "Telephone", "Light", "Sugar", "Boy", "Girl", "Banana", "Corn"]
Let's do some things with stuff.
Oranges
Corn
Corn
Apples Oranges Crows Telephone Light Sugar Boy Girl Banana
Telephone#Sugar
$
加分练习
- 上网阅读一些关于「物件导向程序(Object Oriented Programming)」的资料。晕了吧?嗯,我以前也是。别担心。你将从这本书学到足够用的关于物件导向程序的基础知识,而以后你还可以慢慢学到更多。
- something.methods 和 something的 class 有什么关系?
- 如果你不知道我讲的是些什么东西,别担心。程序设计师为了显得自己聪明,于是就发明了Opject Oriented Programming,简称为OOP,然后他们就开始滥用这个东西了。如果你觉得这东西太难,你可以开始学一下「函式式程序(functional programming)」。