`Object#define_singleton_method(symbol,method)`如何在ruby中运行?

时间:2013-03-16 11:57:17

标签: ruby ruby-1.9.3 singleton-methods

来自Doc of define_singleton_method

我有两种语法来定义singleton方法,如下所示:

  

define_singleton_method(symbol){block} - > proc

使用上面的语法,我尝试了下面的代码和我理解的语法:

define_singleton_method :foo do |params = {}|
 params
end
#=> #<Proc:0x20e6b48@(irb):1 (lambda)>

foo
#=> {}

foo(bar: :baz)
#=> {:bar=>:baz}

foo(bar: :baz ,rar: :gaz )
#=> {:bar=>:baz, :rar=>:gaz}

但需要有人的帮助,用以下语法找出每个例子。

  

define_singleton_method(symbol,method) - &gt; NEW_METHOD

根据文档 - 方法参数可以是 Proc Method UnboundMethod 对象。我没有在那里得到任何例子。

有人可以帮我在这里举一个反对 斜体 字样的例子吗?

2 个答案:

答案 0 :(得分:9)

在参数列表中使用Proclambdaproc->Proc.new语法创建&对象。可以使用Method方法获取method对象,并且可以使用UnboundMethod方法获取instance_method。以下是每个例子:

p = Proc.new {|x| puts x}
m = method(:puts)
um = Object.instance_method(:puts)

define_singleton_method(:my_puts1, p)
define_singleton_method(:my_puts2, m)
define_singleton_method(:my_puts3, um)

my_puts1 42
my_puts2 42
my_puts3 42

答案 1 :(得分:4)

使用Proc

define_singleton_method(:foo, proc{ 'foo' })
foo #=> 'foo'

使用Method

oof = 'oof'
oof.define_singleton_method(:foo, oof.method(:reverse))
oof.foo #=> "foo"

使用UnboundMethod

oof = 'oof'
oof.define_singleton_method(:foo, String.instance_method(:reverse))
oof.foo #=> "foo"