单例法在红宝石中链接

时间:2015-05-22 22:33:20

标签: ruby metaprogramming

有没有办法在Ruby中用dinamically定义和链接单例方法?

假设我有一个定义了方法的类A和一个数组常量。像这样:

class A
  ARR = [:a, :b, :c, :d]

  class << self
    def test

    end
  end
end

有没有办法在test内动态定义方法,所以我最终会得到像

这样的东西
A.test.a
A.test.b
...

2 个答案:

答案 0 :(得分:1)

简短的回答是:不要这样做。 构建另一个类并在测试中使用它。 如果你真的想要这样做,你必须拥有类或OpenStruct之类的东西。

攻击它的一种方法是这样的(注意这不是很有效 - 每次调用测试时它都会构建一个类):

class A
    ARR = [:a, :b, :c, :d]
    def self.test
        Class.new {
            ARR.each do |met|
                 define_method met do
                     puts met
                 end
            end
        }.new
    end    
end

A.test.a
A.test.b

答案 1 :(得分:1)

有几种方法可以做到这一点。

您可以使用匿名类:

class A
  ARR = [:a, :b, :c, :d]

  def self.test
    @test ||= Class.new {
      ARR.each do |method|
        define_method(method) { puts method }
      end
    }.new
  end    
end

或者您可以使用私人课程:

class B
  ARR = [:a, :b, :c, :d]

  def self.test
    @test ||= Test.new
  end

  private

  class Test
    ARR.each do |method|
      define_method(method) { puts method }
    end
  end
end

在任何一种情况下A.test都需要返回一些对象,您可以从中调用abcd方法。