容器
Arrays
Hashes
Blocks 和迭代器
示例
实现迭代器

容器

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 的调用参数。