2011-08-15 68 views
-1
class A 
    @@ololo = 1 
end 

A::ololo 
A.new.ololo 
NoMethodError: undefined method `ololo' 

okey。我需要一个attr_reader红宝石访问静态变量

class B 
    @@ololo = 1 
    attr_reader :ololo 
end 

A::ololo 
NoMethodError: undefined method `ololo' 
A.new.ololo 
=> nil 

wtf?红宝石访问器有没有限制?

class C 
    @@ololo = 1 
    def self.ololo 
    @@ololo 
    end 
    def ololo 
    @@ololo 
    end 
end 

C::ololo 
=> 1 
C.new.ololo 
=> 1 

红宝石男人通常会说“是啊,很好!”。这很不错吗? 任何人都可以提供较短的代码?

+1

[这里](https://gist.github.com/1145995)这可能会帮助你走上正确的道路。它已经太长,因为我已经做了任何与类变量和类级别的实例变量相关的事情来提供正确的答案。 – Nemo157

+0

这是我正在寻找的!但@ fl00r是第一个正确的人^ ___^ – puchu

回答

13

你不能做你想做的事情:)

@harald是对的。 attr_reader将定义吸气剂只为实例变量,对于 “静态”(又名 “类变量”),你需要自己定义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 
+0

写下吧!什么问题?:)因为默认情况下没有任何'static_accessor'。保持冷静,男人 – fl00r

+0

okey。你能解释为什么你粘贴这个FAQ的和平? – puchu

+0

它不是一块常见问题,男人。我以为你不明白这个Ruby的成语。而已。如果这对你来说如此明显 - 那太棒了。 – fl00r

2

attr_accessor :ololo定义了方法ololoololo=其中针对@ololo命名的实例的变量。那么当你尝试访问A::ololo时会发生什么,你会发现你的实例方法ololo,并且因为你试图将它称为类方法而失败。

+0

我正在使用静态变量+ attr_accessor。它不起作用,这是事实。请不要粘贴部分访问器faq – puchu

+0

'attr_accessor:ololo'定义一个名为'@ ololo'的实例变量。不,它没有。第一次设置它们时,实例变量就开始存在 - 它们没有在任何地方定义。 – sepp2k

+0

为什么这样聪明的红宝石不能解决静态和常用变量之间的差异?为什么没有static_accessor? – puchu