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

fil*_*nut 3 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
Run Code Online (Sandbox Code Playgroud)

所以是的,通过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
Run Code Online (Sandbox Code Playgroud)

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

我明显错过了这里的实用工具.

mik*_*kej 5

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

Dog.new.bark do
  puts "Bark, bark, bark!"
  # what goes here?? puts ????.breed   
end
Run Code Online (Sandbox Code Playgroud)

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

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

puts d.bark(&loud)
Run Code Online (Sandbox Code Playgroud)

所以基本上设置可以yield self灵活地使用代码.