ruby访问静态变量

class A @@ololo = 1 end A::ololo A.new.ololo NoMethodError: undefined method `ololo' 

好。 我需要一个attr_reader

 class B @@ololo = 1 attr_reader :ololo end A::ololo NoMethodError: undefined method `ololo' A.new.ololo => nil 

跆拳道? ruby访问者有任何限制吗?

 class C @@ololo = 1 def self.ololo @@ololo end def ololo @@ololo end end C::ololo => 1 C.new.ololo => 1 

ruby男人通常说“是啊!非常好!”。 这很不错吗? 谁能提供更短的代码?

你不能做你想做的事:)

@harald是对的。 attr_reader将仅为实例变量定义GETTER,对于“静态”(又称“类变量”),您需要自己定义setter和getter:

 class A @@ololo = 1 # instance level # getter def ololo @@ololo end # setter def ololo=trololo @@ololo = trololo end # and class level # if you need it # getter def self.ololo @@ololo end # setter def self.ololo=trololo @@ololo = trololo end end 

所以:

 a = A.new b = A.new A.ololo #=> 1 a.ololo #=> 1 A.ololo = 100 A.ololo #=> 100 a.ololo #=> 100 b.ololo #=> 100 a.ololo = 4 A.ololo #=> 4 

较短的一个:

 class A @ololo = 1 class << self attr_accessor :ololo end end 

attr_accessor :ololo定义了ololoololo=的方法,它们对名为@ololo的实例变量起作用。 那么当你试图访问A::ololo ruby时会发现你的实例方法ololo并失败,因为你试图将它称为类方法。

是的你可以。

 class A cattr_accessor :ololo @@ololo = 1 end class B A.ololo #Gets class variable "ololo" from class A end 

这基本上是Ruby on Railsfunction。 但是,在Rails之外,您可以从Ruby Facets gem获得function:

https://github.com/rubyworks/facets/blob/master/lib/core-uncommon/facets/module/cattr.rb

请参阅此讨论: 在rails之外的cattr_accessor