ruby 中的单例方法链接

Singleton method chaining in ruby

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

假设我有一个 class A,其中定义了一个方法和一个数组常量。像这样:

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

  class << self
    def test

    end
  end
end

有没有办法在 test 中动态定义方法,所以我最终得到类似

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

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

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

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

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

您可以使用匿名 class:

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:

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 都需要 return 一些对象,您可以从中调用您的 abcd 方法。