【问题标题】:How does the `Object#define_singleton_method(symbol, method)` works in ruby?`Object#define_singleton_method(symbol, method)` 如何在 ruby​​ 中工作?
【发布时间】:2013-03-16 11:57:16
【问题描述】:

来自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) -> new_method

根据文档 - 方法参数可以是 ProcMethodUnboundMethod 对象。我没有得到任何例子。

谁能在这里帮我找一个反对斜体字的例子?

【问题讨论】:

    标签: ruby ruby-1.9.3 singleton-methods


    【解决方案1】:

    Proc 对象是通过在参数列表中使用 lambdaproc-&gt;Proc.new&amp; 语法创建的。使用method方法可以得到Method对象,使用instance_method方法可以得到UnboundMethod。以下是其中的每一个示例:

    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
    

    【讨论】:

      【解决方案2】:

      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"
      

      【讨论】:

      • 不错的一个!谢谢你给我的例子。 :)
      • :foo的singleton_method的主体oof.method(:reverse)吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 2013-04-11
      • 1970-01-01
      • 2013-08-09
      • 2013-04-18
      相关资源
      最近更新 更多