如何让我的代码记住当前位置,下次显示下一个元素?

时间:2010-11-22 03:19:18

标签: ruby yield

在Python中,iter()使用如下:

>>> a=[1,2,4]
>>> b=iter(a)
>>> b.next()
1
>>> b.next()
2
>>> b.next()
4
>>> b.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> 

Ruby有相同的功能吗?

我试过了,但似乎有一个问题:

ruby-1.9.2-p0 > a=[1,2,3]
 => [1, 2, 3] 
ruby-1.9.2-p0 > def b()
ruby-1.9.2-p0 ?>  for i in a
ruby-1.9.2-p0 ?>    yield i
ruby-1.9.2-p0 ?>    end
ruby-1.9.2-p0 ?>  end
 => nil 
ruby-1.9.2-p0 > b
NameError: undefined local variable or method `a' for #<Object:0xb7878950>

为什么Ruby没有找到a变量?

3 个答案:

答案 0 :(得分:2)

Ruby也有迭代器。

基本用途是:

>> iter = [0,1,2,3].each #=> #<Enumerator: [0, 1, 2, 3]:each>
>> iter.next #=> 0
>> iter.next #=> 1
>> iter.next #=> 2
>> iter.next #=> 3
>> iter.next
StopIteration: iteration reached an end
        from (irb):6:in `next'
        from (irb):6
        from /Users/greg/.rvm/rubies/ruby-1.9.2-p0/bin/irb:16:in `<main>'
>>

您可以在方法中使用它:

def iter(ary)
  ary.each do |i|
    yield i
  end
end

iter([1,2,3]) { |i| puts i}
# >> 1
# >> 2
# >> 3

您的Ruby代码失败,因为a不在范围内,换句话说,Ruby在a方法中没有看到b。它的典型定义方式如上所示。所以,你的代码很接近。

另外,请注意我们很少在Ruby中编写for / loop。有一些原因,例如for循环在运行后留下一个局部变量,如果没有正确定义循环,可能会运行数组的末尾,例如,如果要创建索引来访问单个元素一个数组。相反,我们使用.each迭代器依次返回每个元素,使其无法完成,并且不会留下局部变量。

答案 1 :(得分:1)

使用您提供的代码,并假设您希望打印出值:


a = [1, 2, 3]
def b(a)
  a.each { |i| puts i }
end
b(a)

(正如Mark Thomas所指出的那样有更好的方法)

答案 2 :(得分:1)

[1,2,4].each { |i| puts i }