有没有办法在Ruby中用dinamically定义和链接单例方法?
假设我有一个定义了方法的类A和一个数组常量。像这样:
class A
ARR = [:a, :b, :c, :d]
class << self
def test
end
end
end
有没有办法在test
内动态定义方法,所以我最终会得到像
A.test.a
A.test.b
...
答案 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
都需要返回一些对象,您可以从中调用a
,b
,c
,d
方法。