ruby访问静态变量

时间:2011-08-15 09:20:36

标签: ruby syntax

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

红宝石男人通常会说“是的!非常好!”。这个很好吗? 任何人都可以提供更短的代码吗?

3 个答案:

答案 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的实例变量的方法ololoololo=。那么,当您尝试访问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

见这个讨论: cattr_accessor outside of rails