【问题标题】:Is it possible to define a Ruby singleton method using a block?是否可以使用块定义 Ruby 单例方法?
【发布时间】:2010-09-13 06:06:22
【问题描述】:

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

例如,

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

o = Object.new
define_say o, "hello world!"
o.say

这不起作用,因为通过“def”定义单例方法不是闭包,所以我得到一个异常,“msg”是未定义的变量或方法。

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

所以,我很想这样写:

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

有谁知道我如何在不必创建存储 Proc 的方法然后在单例方法中使用 Proc 的情况下实现这一点? (基本上,我想要一种干净、简洁的方式)

【问题讨论】:

    标签: ruby closures singleton-methods


    【解决方案1】:

    Object#define_singleton_method顺便添加到ruby-1.9.2:

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

    【讨论】:

      【解决方案2】:

      这是您正在寻找的答案

      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
      

      用法(从 IRB 粘贴)

      >> s = "my string"
      => "my string"
      >> define_say(s, "I am S")
      => #<Proc:0xb6ed55b0@(irb):11>
      >> s.say
      I am S
      => nil
      

      如需更多信息(以及一个使其不那么混乱的小图书馆),请阅读以下内容:

      http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html

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

      【讨论】:

      • 我更改了链接,因为_为什么在发布此答案后就擅离职守了。
      猜你喜欢
      • 2011-06-09
      • 2010-12-16
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 2011-04-03
      相关资源
      最近更新 更多