Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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 singleton方法?_Ruby_Closures_Singleton Methods - Fatal编程技术网

是否可以使用块定义Ruby singleton方法?

是否可以使用块定义Ruby singleton方法?,ruby,closures,singleton-methods,Ruby,Closures,Singleton Methods,所以,我想为一个对象定义一个单例方法,但我想使用闭包 比如说, def define_say(obj, msg) def obj.say puts msg end end o = Object.new define_say o, "hello world!" o.say 这不起作用,因为通过“def”定义单例方法不是闭包,所以我得到一个异常,“msg”是一个未定义的变量或方法 我想做的是在模块类中使用“define_method”方法,但据我所知,这只能用于在类上定义方法。。

所以,我想为一个对象定义一个单例方法,但我想使用闭包

比如说,

def define_say(obj, msg)
  def obj.say
    puts msg
  end
end

o = Object.new
define_say o, "hello world!"
o.say
这不起作用,因为通过“def”定义单例方法不是闭包,所以我得到一个异常,“msg”是一个未定义的变量或方法

我想做的是在模块类中使用“define_method”方法,但据我所知,这只能用于在类上定义方法。。。但是我想要一个单例方法

所以,我想写这样的东西:

def define_say(obj, msg)
  obj.define_singleton_method(:say) {
    puts msg
  }
end

有人知道我如何做到这一点,而不必创建一个方法来存储一个Proc,然后在一个单例方法中使用这个Proc吗?(基本上,我想要一种干净、不黑的方式来做这件事)

这里有一个答案,它符合你的要求

def define_say(obj, msg)
  # Get a handle to the singleton class of obj
  metaclass = class << obj; self; end 

  # add the method using define_method instead of def x.say so we can use a closure
  metaclass.send :define_method, :say do
    puts msg
  end
end
def定义(obj,msg)
#获取obj的singleton类的句柄
metaclass=class>s=“我的字符串”
=>“我的字符串”
>>定义你说的“我是”
=> #
>>萨伊
我是S
=>零
欲了解更多信息(以及一个小图书馆,使其不那么凌乱),请阅读以下内容:

顺便说一句,如果你是一个ruby程序员,而且你还没有读过,现在就去做吧~

通过以下方式添加到ruby-1.9.2中:

def define_say(obj, msg)
  obj.define_singleton_method(:say) do
    puts msg
  end
end

我更改了链接,因为自从这个答案发布后,你为什么擅离职守。
def define_say(obj, msg)
  obj.define_singleton_method(:say) do
    puts msg
  end
end