试图学习/理解Ruby setter和getter方法

时间:2012-01-05 03:50:56

标签: ruby

我正在学习编程并决定尝试使用Ruby。我确定这是一个愚蠢的问题,但是教练正在讨论setter和getter方法,我很困惑。这是一个例子:

class Human
  def noise=(noise)
    @noise = noise
  end

  def noise
    @noise
  end
end

由此,该类被实例化,我可以把它说出来:

man = Human.new
man.noise=("Howdie!")
puts man.noise

这导致Howdie!

现在令我困惑的是教师说没有getter方法(两种方法中的第二种),就没有办法与实例变量@noi​​se进行交互。

但是当我删除getter方法时,我仍然可以访问@noise,参见示例:

class Human
  def noise=(noise)
    @noise = noise
  end
end

man = Human.new
puts man.noise=("Howdie!")

这与使用它的getter方法相同。

所以现在我很困惑。为什么需要吸气剂?没有它,教师的意思是无法访问实例变量?他有可能使用旧版本的Ruby吗?

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:34)

即使没有getter,您也可以从属于该实例的其他方法与该实例变量进行交互:

def noise=(noise)
  @noise = noise
end

def last_noise
  @noise
end

不需要定义与方法同名的getter;这两者根本没有联系。需要getter来“获取”实例变量的值,但只能使用 short 语法。

您的示例中发生的是您正在初始化新对象(Human.new),然后使用方法(noise=,是方法名称包含=符号)只是碰巧定义了一个实例变量(即该实例的变量只是),然后最终用另一个方法调用检索该实例变量。 / p>

您实际上可以使用instance_variable_get来获取实例变量,而无需定义任何 getter:

man = Human.new
man.noise = "Howdie"
man.instance_variable_get("@noise")

这将返回“Howdie”,即使没有定义getter。

不,我不认为他使用旧版本的Ruby。

答案 1 :(得分:14)

代码行

puts man.noise=("Howdie!")

不使用getter方法,因此不需要定义getter方法来使其工作。该行只使用setter方法。 setter方法的返回值自动等于等号右边的任何值,所以“Howdie!”传递给puts

代码行

puts man.noise

是否使用了getter方法,如果删除getter方法,它将无效。

答案 2 :(得分:5)

当然,他们都返回一个值,但他们的行为是不同的。

假设已有会员@a

使用getter,可以获得@a的当前值,而无需修改它。

使用setter,一个修改@a,并将其新值作为返回值。

在考虑二传手的行为时,请注意:

  1. 使用setter无法获取@a的旧值,并被覆盖。

  2. setter返回的内容实际上在调用setter之前就已经知道了。

答案 3 :(得分:1)

可能是getter和setter的注意力是因为其他一些语言允许你直接访问类变量。的Python:

class k:
    i = 100

print k.i # 100
k.i = 200
print k.i # 200

相反,Ruby将其所有变量完全保密到类中,并且只通过访问器方法公开它们。

在您的示例中,如果您删除了getter,您确实可以通过setter与变量(即:更改它)进行交互,但是当您需要它时,您无法将其恢复(以常规方式)。