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
定义了ololo
和ololo=
的方法,它们对名为@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