ruby访问静态变量

puc*_*chu 2 ruby syntax

class A
  @@ololo = 1
end

A::ololo
A.new.ololo
NoMethodError: undefined method `ololo'
Run Code Online (Sandbox Code Playgroud)

好.我需要一个attr_reader

class B
  @@ololo = 1
  attr_reader :ololo
end

A::ololo
NoMethodError: undefined method `ololo'
A.new.ololo
=> nil
Run Code Online (Sandbox Code Playgroud)

跆拳道?红宝石访问者有任何限制吗?

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

C::ololo
=> 1
C.new.ololo
=> 1
Run Code Online (Sandbox Code Playgroud)

红宝石男人通常说"是啊!非常好!".这个很好吗? 谁能提供更短的代码?

fl0*_*00r 15

你不能做你想做的事:)

@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
Run Code Online (Sandbox Code Playgroud)

所以:

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
Run Code Online (Sandbox Code Playgroud)

...

较短的一个:

class A
  @ololo = 1
  class << self
    attr_accessor :ololo
  end
end
Run Code Online (Sandbox Code Playgroud)