Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何在传递的块中引用对象的参数?_Ruby_Oop_Metaprogramming - Fatal编程技术网

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