Ruby 如何在传递的块中引用对象的参数?
我试图引用一个对象的一个参数,该参数位于与它一起传递的块内部Ruby 如何在传递的块中引用对象的参数?,ruby,oop,metaprogramming,Ruby,Oop,Metaprogramming,我试图引用一个对象的一个参数,该参数位于与它一起传递的块内部 def command(attributes = {}, &block) yield end command(attr_1: 'Open Mike Night', attr_2: 2033392, attr_3: [9.29, 10.08, 12.32]) do |event| event.message.delete puts "#{self.attributes[:attr_
def command(attributes = {}, &block)
yield
end
command(attr_1: 'Open Mike Night',
attr_2: 2033392,
attr_3: [9.29, 10.08, 12.32]) do |event|
event.message.delete
puts "#{self.attributes[:attr_1]}" # <-- That didn't work.
end
def命令(属性={},&block)
产量
结束
命令(属性1:“开放迈克之夜”,
属性2:2033392,
attr_3:[9.29,10.08,12.32])do|事件|
event.message.delete
把“#{self.attributes[:attr_1]}”#从我的头上放下来你可以这样做。注意,我不知道这是否适用于生产代码
这段代码通过迭代参数散列的键来为每个键创建实例变量。然后,当我们调用命令
时,我们可以使用相应的实例变量引用块中每个键的值:
def command(attributes = {}, &block)
attributes.each_key { |key|
instance_variable_set("@#{key}",attributes[key])
}
yield
end
command(attr_1: 'Open Mike Night',
attr_2: 2033392,
attr_3: [9.29, 10.08, 12.32]) do |event|
puts "#{@attr_1}"
end
印刷品:
开放迈克之夜
将它们交给块:)
方法范围内可用的任何方法、常量或变量都可以作为yield
的参数,作为块变量发送到块中。然后你可以随心所欲地使用它。在这种情况下,attrs
也将是一个完全可选的变量,没有它块将是有效的
command(attributes) { |obj| p obj.object_id } # => 70309890142840
另外,如果您使用的是yield
,则方法签名中不需要和block
。您在问题中也没有给yield
一个参数,而是将|event |
变量传递到块中,该变量应该是nil
。所以我在上面的例子中忽略了这一点 最后一个键是否应该是attr_3
?@sagarpandya2你说得对,对不起!您的命令中是否有yield
定义?@sagarpandya82是。再次抱歉,我没有将其添加到中。如果该方法定义在与调用它的位置不同的范围内,则此操作不起作用。块的范围取决于其周围环境,因此如果命令
在A类
中定义,但方法在B类
中调用,@attr_1
将在B
的上下文中进行评估,而不是A
command(attributes) { |obj| p obj.object_id } # => 70309890142840