Ruby 要访问类变量,您只能有一个setter方法而没有getter方法吗?

Ruby 要访问类变量,您只能有一个setter方法而没有getter方法吗?,ruby,Ruby,鉴于以下代码: class Man def self.noise=(noise) @@noise = noise end end puts Man.noise = ("YO") 我使用了setter方法self.noise,但实际上没有使用getter方法,而且它很有效。我很想知道类变量是否需要getter和setter方法才能工作 所有这些中令人困惑的一点是,实例变量似乎需要访问getter和setter方法。如果您只有一个setter方法来访问实例变量,那么如果您调用se

鉴于以下代码:

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 
因为
Man.noise
位于赋值运算符的左侧,所以这里没有调用“getter”方法。这会调用
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!"
class-Man
课堂“你好,世界!”
在Rails环境中,类有
cattr\u访问器
,模块有
mattr\u访问器
,无需
class就可以实现这一点,因为
Man.noise
位于赋值操作符的左侧,所以这里不调用“getter”方法。这会调用
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!"
class-Man
课堂“你好,世界!”

在Rails环境中,类有
cattr\u访问器
,模块有
mattr\u访问器
,无需
class编写类变量即可完成此操作。您可以阅读以下内容:

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 
XYZ
XYZ
然而,当涉及到继承时,您应该非常小心

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

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

正确地编写类变量。您可以阅读以下内容:

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 
XYZ
XYZ
然而,当涉及到继承时,您应该非常小心

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

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

这问了基本相同的问题,但关于实例变量,是否有助于澄清问题?我完全理解实例变量需要同时使用getter和setter方法,对类变量也有同样的疑问。为了让程序工作,是否有必要同时拥有这两个变量。这个问题基本上是相同的,但是关于实例变量的,它有助于澄清问题吗?我完全理解实例变量需要同时使用getter和setter方法,对类变量也有同样的疑问。我知道我在这个类变量的情况下使用了一个“setter”方法,但它似乎在没有“getter”方法的情况下运行。这与实例变量相比,如果我直接调用“setter方法”,而不使用“getter”方法,则不会返回实例变量。我只是想确认我是否正确理解了访问类变量不需要getter和setter方法(本例中只需要setter),而不需要实例变量。这是真的吗?只有setter(mutator)是不寻常的。通常情况下,您可以成对创建这些文件,以便进行读写。在你的例子中,你只定义了一个变异子,而不是一个读取器,所以你只做了一半的工作。它基本上是一个只写的类属性。我意识到同时使用reader和writer方法更好。我只是想确认,对于类变量(如果您愿意的话),您可以只使用setter方法并调用它来访问类变量吗?我知道我在这个类变量的情况下使用了“setter”方法,但它似乎在没有“getter”方法的情况下运行。这与实例变量相比,如果我直接调用“setter方法”,而不使用“getter”方法,则不会返回实例变量。我只是想确认我是否正确理解了访问类变量不需要getter和setter方法(本例中只需要setter),而不需要实例变量。这是真的吗?只有setter(mutator)是不寻常的。通常情况下,您可以成对创建这些文件,以便进行读写。在你的例子中,你只定义了一个变异子,而不是一个读取器,所以你只做了一半的工作。它基本上是一个只写的类属性。我意识到同时使用reader和writer方法更好。只是想确认一下,对于类变量(如果您愿意的话),您可以只使用setter方法并调用它来访问类变量吗?