容器
Arrays
a = [ 3.1415926, "pie", 99 ] a.class a.length a[0] a[1] b = Array.new b.class b.length b
也可以用 [start,count] 方式做下标:
a = [ 1, 3, 5, 7, 9 ] a[1,3] # 得到 [3,5,7] a[3,1] # 得到 [7] a[-3,2] # 得到 [5,7]
也可以使用 range ,3个点不包含最后一个索引:
a = [1,3,5,7,9] a[1..3] # 得到 [3,5,7] a[1...3] # 得到 [3,5] a[3..3] # 得到 [7] a[-3..-1] # 得到 [5,7,9]
"[]" 操作符有个对应的操作符 "[]=" 设置数组元素的值。
a = [1,3,5,7,9] a[2,2] = 'cat' # [1,3,"cat",9] a[2,0] = 'dog' # [1,3,"dog","cat",9] a[1,1] = [9,8,7] # [1,9,8,7,"dog","cat",9] a[0..3] = [] # ["dog","cat",9] a[5..6] = 99,98 # ["dog","cat",9,nil,nil,99,98]
Hashes
h = {'dog' => 'canine', 'cat' => 'feline', 'donkey' => 'asinine'}
h.length
h['dog']
Blocks 和迭代器
示例
数组有一个 find 方法,这是一个迭代器,它反复调用 block 中的代码
class SongList
def with_title(title)
@songs.find {|song| title == song.name}
end
end
实现迭代器
Ruby 的迭代器只不过是可以用 block 的方法而已。Ruby 的 block 一般作为参 数传递给方法。在方法内部,block 可以像方法一样被 yield 语句调用。
def three_times
yield
yield
yield
end
three_times { puts "Hello" }
传递参数给 block
def fib_up_to(max)
i1,i2 = 1,1
while i1 <= max
yield i1
i1,i2 = i2, i1+i2
end
end
fib_up_to(1000) {|f| print f," "}
两个 "|" 符号之间是参数列表,接受 yield 的调用参数。
