ruby 访问静态变量

标签 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

什么鬼? 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

关于ruby 访问静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7063371/

相关文章:

ruby-on-rails - Ruby on Rails 中的循环内循环

ruby - 如何在命名空间类中包含模块?

php - 试图设置无效字符数组的语法错误

javascript - 为什么 JSON.parse 对引号如此挑剔?

Vim 语法递归匹配第一个和第二个元素

ruby-on-rails - Capistrano 3 - 理解任务

ruby-on-rails - 在 Gemfile 和 .ruby-version Dotfile 中列出 Ruby 版本是一种不好的做法吗?

mysql - phpmyadmin 创建 ENUM 错误

c# - 命名参数的规则是什么?为什么?

html - 如何将隐藏表格放入表格中?