【问题标题】:Ruby Yield and For LoopRuby Yield 和 For 循环
【发布时间】:2016-01-02 20:05:41
【问题描述】:

我正在学习 Ruby 中的 eachfor 循环的简单教程。这应该是更简单的示例之一,但由于某种原因,我不了解 yield 语句和 for 循环之间的交互。

class MyEachThing
  def each
    yield 1
    yield 42
    yield 2
    yield 42
    yield 3
  end
end

for i in MyEachThing.new
  p i
end
# >> 1
# >> 42
# >> 2
# >> 42
# >> 3

我编写的下一个示例中的产量对我来说很有意义:

def calling
    p yield(45)
end

calling {|i| i*2}

我只是不明白第一个示例是如何工作的。谢谢你的帮助。

【问题讨论】:

    标签: ruby for-loop return each yield


    【解决方案1】:
    for i in MyEachThing.new
      p i
    end
    

    类似这样:

    MyEachThing.new.each do |i|
      p i
    end
    

    这意味着,您在MyEachThing 实例上调用each 方法并将i 传递给块。

    而且,yield 等价于:block.call 表示,您正在使用传递的参数调用块(在本例中为 i)。

    yield i 等价于:block.call(i),而您的块只是打印 i 的值。

    【讨论】:

    • @K 明白了!谢谢。在这种情况下,for 方法在语法上似乎很奇怪。 each 方法对我来说更有意义。
    • 是的,使用each 更可取,因为它更符合习惯。有关更多有趣信息,请参阅此帖子:stackoverflow.com/questions/3294509/for-vs-each-in-ruby
    • 表达式并不完全“等价”。如果在每个end 之后添加p i,则使用for 时会打印i 的最后一个值,而使用each 时会引发异常:NameError: undefined local variable or method 'i' for main:Object....
    • ...原因是for(以及whileuntil)没有引入新的作用域,所以在forend之间赋值的变量是可在end 之后查看或更改。相比之下,块创建了一个新的范围,因此在块内创建的变量在块外是不可见的。 (但是,在块之前创建并在块内修改的变量在块结束后可见。)通常,编码人员更喜欢使用块,部分是为了封装信息。
    • @inthenameofmusik:“for 方法在语法上看起来很奇怪”的原因是因为它是关键字,而不是方法。
    猜你喜欢
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2012-05-10
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多