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 一些对象,您可以从中调用您的 a
、b
、c
、d
方法。
有没有办法在 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 一些对象,您可以从中调用您的 a
、b
、c
、d
方法。