作为一个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
。
我显然错过了这里的实用工具。
答案 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