Ruby中是否有与singleton_variable_set等价的元素?
对于我的用例,我需要Ruby中的Ruby中是否有与singleton_variable_set等价的元素?,ruby,Ruby,对于我的用例,我需要Ruby中的singleton\u variable\u set。但不存在这样的情况: > A = Class.new => A > A.respond_to? :instance_variable_set => true > A.respond_to? :class_variable_set => true > A.respond_to? :class_instance_variable_set => false A.
singleton\u variable\u set
。但不存在这样的情况:
> A = Class.new
=> A
> A.respond_to? :instance_variable_set
=> true
> A.respond_to? :class_variable_set
=> true
> A.respond_to? :class_instance_variable_set
=> false
A.respond_to? :singleton_variable_set
=> false
为什么我需要它?我正在创建一个匿名类,它在包含方法中有一个绑定,绑定到我的匿名类中所需的变量,作为该类的实例方法和单例方法:
def prepare(ac_relation)
Class.new ActionContainer::Base do
mattr_accessor :ac_relation
instance_variable_set(:@ac_relation, ac_relation)
singleton_variable_set(:@ac_relation, ac_relation)
end
end
我需要ac_关系作为新创建的匿名类的实例和单例方法。不幸的是,单例变量集不存在。我怎样才能实现我想要的
这是我提出的有效解决方案,但我不喜欢:
val = 2
c = Class.new do
attr_accessor :cc
class << self
attr_accessor :cc
end
@cc = 2
instance_variable_set(:@cc, val)
def initialize
@cc = self.class.instance_variable_get(:@cc)
end
end
val=2
c=新do类
属性存取器:cc
类我不知道我们是否能做到这一点,但如果您只需要在实例和类级别上都有可用的方法,那么您可以使用一个模块来做类似的事情
module SampleModule
module ClassMethods
def sample_method params
...
end
end
def sample_method params
...
end
def self.included base
base.extend ClassMethods
end
end
在类中包含此模块,它将公开实例方法,并通过self.included
块在类级别公开方法
希望这有助于同样可以在块内使用单例方法检索值:
Class.new(ActionContainer::Base) do
define_singleton_method(:ac_relation) { @ac_relation }
@ac_relation = ac_relation
end
如果您需要公共设置器:
define_singleton_method(:ac_relation=) { |value| @ac_relation = value }
这将避免可见性问题,并且需要在另一个方法中对类调用instance\u variable\u get
因此,您实际上不需要单例变量集
方法。块在类的上下文中执行,因此在其中定义实例变量与:
class MyClass
class << self
# Defining instance variables here
end
end
我还没有试过,但它看起来比我的干净。
def prepare(some_value)
Class.new do
define_singleton_method(:ac_relation) { @ac_relation }
define_singleton_method(:ac_relation=) { |value| @ac_relation = value }
@ac_relation = some_value
end
end
klass = prepare("foobar")
klass.ac_relation
#=> "foobar"