Ruby中是否有与singleton_variable_set等价的元素?

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.

对于我的用例,我需要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.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"