gpt4 book ai didi

ruby - 为什么 `yield self` 有帮助?

转载 作者:数据小太阳 更新时间:2023-10-29 07:45:59 24 4
gpt4 key购买 nike

作为一个 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,我现在可以访问我正在生成的 block 中的 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

我显然错过了这里的实用程序。

最佳答案

第二个示例之所以有效,是因为您有一个引用 Dog 的局部变量。作为替代方案,请考虑如果使用匿名实例会发生什么:

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

或者您可能想在其他地方声明您的 block 并将其传递给例如

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

puts d.bark(&loud)

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

关于ruby - 为什么 `yield self` 有帮助?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40308054/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com