在Ruby中,有没有更好的方法来提取类变量?

在Ruby中,有没有更好的方法来提取类变量?,ruby,class-variables,Ruby,Class Variables,我个人并不反对这一点,除了它很长,但真正困扰我的是单词eval 我在JavaScript中做了很多事情,我从任何类似于eval的东西运行,就像它是魔鬼一样,我也不喜欢参数是字符串的事实(同样,可能是因为它是eval) 我知道我可以编写自己的方法来解决方法名长度问题、我的“方法名问题”和参数字符串问题,但我真正想知道的是:是否有更好、更短、更奇特、更自然的方法来提取类变量? 旁注:我知道class\u variable\u get()和class\u variables()的存在,但它们看起来并不

我个人并不反对这一点,除了它很长,但真正困扰我的是单词
eval

我在JavaScript中做了很多事情,我从任何类似于eval的东西运行,就像它是魔鬼一样,我也不喜欢参数是字符串的事实(同样,可能是因为它是eval)

我知道我可以编写自己的方法来解决方法名长度问题、我的“方法名问题”和参数字符串问题,但我真正想知道的是:是否有更好、更短、更奇特、更自然的方法来提取类变量?

旁注:我知道
class\u variable\u get()
class\u variables()
的存在,但它们看起来并不吸引我;太长了,不是吗

编辑:将问题更新为更具体的问题

谢谢

使用
class\u variable\u get
,但仅在必须时使用 这是更好的方法,而不是它对你没有吸引力。如果您进入一个类并破坏了封装,那么使用这个额外的屏障来表示您做错了什么可能是合适的

为要访问的变量创建访问器方法 如果这些是您的类,并且访问变量不会破坏封装,那么您应该为它们创建类访问器方法,使其更简单、更美观:

class Foo
  def self.bar
    @@bar
  end
end
p Foo.bar
但是,如果这是您的类,您确定需要类变量吗?如果您不理解其含义(见下文),您可能实际上需要类本身的实例变量:

class Foo
  class << self
    attr_accessor :bar
  end
end

Foo.bar = 42
p Foo.bar

您正在尝试执行哪些可能需要
评估的操作?通常有一种方法可以得到你想要的东西,而不会弄得一团糟。@tadman啊,你说得对。我没有抓住问题的重点。我基本上想要访问一个类变量。所以,一些与课堂内容类似的东西。Class_eval('@@yay')把这个答案写了出来,然后看到你发了帖子。不过,我可能想补充一些关于暗示的内容。我想我需要一个类变量。如果我想让变量在类的所有实例中都可以访问,我会想要一个吗?另一件事,我不完全确定我是否真正理解了类变量和您在提供的第二个代码段D:.中所做的事情之间的区别!谢谢你的回答。@withadot我已经更新了答案,解释了为什么你可能不想要一个类变量,并提供了一个关于如何从类的实例(即
self.class.methodname
)中最好地利用类方法的进一步示例。@Phrogz矩形示例值得一提。完美的事实上,这正是我所需要的。IlyActiveSupport为类添加了
cattr\u访问器
,为模块添加了
mattr\u访问器
,这些模块可能会清理大量此类内容。
class Rectangle
  def self.instances
    @@instances ||= []
  end
  def initialize
    (@@instances ||= []) << self
  end
end

class Square < Rectangle
  def initialize
    super
  end
end

2.times{ Rectangle.new }
p Rectangle.instances
#=> [#<Rectangle:0x25c7808>, #<Rectangle:0x25c77d8>]

Square.new
p Square.instances
#=> [#<Rectangle:0x25c7808>, #<Rectangle:0x25c77d8>, #<Square:0x25c76d0>]
class Rectangle
  def self.instances
    @instances ||= []
  end
  def initialize
    self.class.instances << self
  end
end

class Square < Rectangle
  def initialize
    super
  end
end

2.times{ Rectangle.new }
p Rectangle.instances
#=> [#<Rectangle:0x25c7808>, #<Rectangle:0x25c77d8>]

2.times{ Square.new }
p Square.instances
#=> [#<Square:0x25c76d0>, #<Square:0x25c76b8>]
Foo.class_eval('@@bar') # ugh
Foo.class_eval{ @@bar } # yum