要访问类变量,您是否只能使用没有getter方法的setter方法?

时间:2016-11-05 01:32:18

标签: ruby

鉴于以下代码:

class Man
  def self.noise=(noise)
    @@noise = noise
  end
end

puts Man.noise = ("YO")

我使用了setter方法self.noise,但实际上并没有使用getter方法而且它有效。我很想知道类变量是否需要getter和setter方法才能工作?

所有这些中令人困惑的元素是实例变量似乎需要访问getter和setter方法。如果您只有一个setter方法来访问实例变量,那么如果调用setter方法,则不会返回该变量。

我的问题是,对于类变量,你是否只有一个setter方法并调用它,而没有getter方法来访问类变量?在这种情况下,getter方法将是:

self.noise
  @@noise
end 

2 个答案:

答案 0 :(得分:2)

你没有打电话给" getter"此处的方法,因为Man.noise位于赋值运算符的左侧。这会调用Man.noise=并且您已经定义了这个。

如果您尝试调用它,则会得到:

Man.noise
#! NoMethodError: undefined method `noise' for Man:Class

你可以做这样的事情,让你的生活更轻松:

class Man
  class << self
    attr_accessor :noise
  end
end

Man.noise = 'Hello world!'
Man.noise
# => "Hello world!"

在Rails环境中,您有cattr_accessor个类,mattr_accessor用于为您执行此操作的模块,而不需要class << self等。

需要注意的一点是尽可能使用常规实例变量。这里没有必要使用@@

答案 1 :(得分:0)

正确完成编写类变量。您可以按如下方式阅读:

class Man
  def self.noise=(noise)
    @@noise = noise
  end
  def self.noise
     @@noise ||= nil
  end
end

puts "Hello world!"
puts Man.noise
puts Man.noise = ("YO")
puts Man.noise

输出:

Hello world!

YO
YO 

但是,在继承方面你应该非常小心。

class Man
  def self.noise=(noise)
    @@noise = noise
  end
  def self.noise
     @@noise ||= nil
  end
end


class Man1 < Man

end

Man.noise = ("YO")
Man1.noise = ("XYZ")
puts Man1.noise
puts Man.noise

输出:

XYZ
XYZ

请注意,更改子类的noise也会更改父类的noise