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
跆拳道?红宝石访问者有任何限制吗?
class C
@@ololo = 1
def self.ololo
@@ololo
end
def ololo
@@ololo
end
end
C::ololo
=> 1
C.new.ololo
=> 1
红宝石男人通常会说“是的!非常好!”。这个很好吗? 任何人都可以提供更短的代码吗?
答案 0 :(得分:14)
你无法做你想做的事情:)
@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
答案 1 :(得分:3)
attr_accessor :ololo
定义了针对名为@ololo的实例变量的方法ololo
和ololo=
。那么,当您尝试访问A::ololo
ruby时会发现您的实例方法ololo
会失败,因为您尝试将其称为类方法。
答案 2 :(得分:2)
是的,你可以。
class A
cattr_accessor :ololo
@@ololo = 1
end
class B
A.ololo #Gets class variable "ololo" from class A
end
这基本上是Ruby on Rails功能。但是,在Rails之外,您可以从Ruby Facets gem获得功能:
https://github.com/rubyworks/facets/blob/master/lib/core-uncommon/facets/module/cattr.rb