鉴于以下代码:
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
答案 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
。