为什么`收益自我'有帮助?

时间:2016-10-28 15:10:33

标签: ruby

作为一个Ruby新手,我很困惑为什么它会对方法定义中的yield self有益。我在许多教程中都遇到过这个功能,因为它是有用的东西 - 它对我来说非常有意义如何这是有效的,但我不明白为什么你曾经使用它。

假设我有以下代码:

class Dog

  attr_accessor :breed

  def initialize
    @breed = "Westie"
  end

  def bark
    puts "Woof!"
    yield self if block_given?
  end

end

fido = Dog.new

fido.bark do |d|
  puts "Bark, bark, bark!"
  puts d.breed  
end

所以是的,通过yield self,我现在可以访问我正在产生的块中Dog类的实例。

但是,即使我不yield self,我仍然可以访问该实例,对吧?换句话说,下面的代码不会完全与上面的代码相同吗?

class Dog

  attr_accessor :breed

  def initialize
    @breed = "Westie"
  end

  def bark
    puts "Woof!"
    yield
  end

end

fido = Dog.new

fido.bark do
  puts "Bark, bark, bark!"
  puts fido.breed   
end

请注意,在第二个代码示例中,我没有调用yield self

我显然错过了这里的实用工具。

2 个答案:

答案 0 :(得分:5)

第二个例子有效,因为你有一个局部变量引用Dog的具体情况。作为替代方案,考虑使用匿名实例会发生什么:

Dog.new.bark do
  puts "Bark, bark, bark!"
  # what goes here?? puts ????.breed   
end

或者你想在其他地方声明你的块并传递它,例如。

loud = lambda { |dog| puts "A #{dog.breed} doing some LOUD YAPPING" }

puts d.bark(&loud)

因此基本上使用yield self进行设置可以灵活地使用代码。

答案 1 :(得分:3)

您的示例非常简单,其中yield self没有明显的用途。

有时 有用,与tap有用的方式相同:它允许您定义和使用值而不在本地范围中引入变量。< / p>

一个(诚然非常做作)的例子是:

Dog.new.bark do |d|
  puts d.breed
end