作为一个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.
我明显错过了这里的实用工具.
第二个例子是有效的,因为你有一个局部变量引用的具体情况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灵活地使用代码.
| 归档时间: |
|
| 查看次数: |
426 次 |
| 最近记录: |