gpt4 book ai didi

ruby - 在 Ruby 中引用传递的 block 中的调用对象

转载 作者:数据小太阳 更新时间:2023-10-29 08:04:30 26 4
gpt4 key购买 nike

有没有办法在被调用的 block 中获取被调用的对象。例如, block 是否有任何方法可以访问方法 batman 或类 SuperHeros

的范围
class SuperHeros

attr_accessor :news

def initialize
@news = []
end

def batman task
puts "Batman: #{task} - done"
yield "feed cat"
@news << task
end

end

cat_woman = lambda do |task|
puts "Cat Woman: #{task} - done"
# invoker.news << task
end

robin = lambda do |task|
puts "Robin: #{task} - done"
# invoker.news << task
end


characters = SuperHeros.new
characters.batman("kick Joker's ass", &cat_woman)
characters.batman("break Bane's bones", &robin)

最佳答案

您可以使用类似于 Instance eval with delegation 的内容图案,用于 - 例如 - 在 Savon 中 gem :

def batman(task, &block)
@original_self = eval('self', block.binding)
puts "Batman: #{task} - done"
instance_exec('feed cat', &block)
@news << task
end

private

def method_missing(method, *args, &block)
if @original_self
@original_self.send(method, *args, &block)
else
super
end
end

在这种方法中,当您在传递给 batman 方法的 block 内调用方法(使用隐式接收器)时,它会在 SuperHeros 实例的上下文中调用。如果没有这样的方法可用,则调用(通过 method_missing)到原始 block self

关于ruby - 在 Ruby 中引用传递的 block 中的调用对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19834086/

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