我正在学习编程,决定试试Ruby.我相信这是一个愚蠢的问题,但老师正在谈论二传和传接球的方法,我很困惑.下面是一个例子:

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

  def noise
    @noise
  end
end

从这里,这个类被实例化,我可以这样说:

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

这将导致Howdie!人死亡

现在让我困惑的是,讲师说如果没有getter方法(两种方法中的第二种),就无法与实例变量@noise交互.

但当我删除getter方法时,我仍然能够访问@noise,请参见示例:

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

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

这与使用getter方法时的效果相同.

所以现在我很困惑.为什么需要Getters ?如果没有实例变量,讲师不能访问它是什么意思?他可能使用的是旧版本的Ruby吗?

提前感谢你的帮助.

推荐答案

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

def noise=(noise)
  @noise = noise
end

def last_noise
  @noise
end

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

在您的示例中,您正在初始化一个新对象(Human.new),然后使用一个方法(noise=,是的,方法名称包含=符号),该方法恰好定义了一个实例变量(即,该实例的变量just),最后使用another方法调用检索该实例变量.

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

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

这将返回"Howdie",即使没有定义getter.

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

Ruby相关问答推荐

如何通过语法将Ruby Sorbet签名突出显示为不强调的 comments ?

Ruby类构造函数使用`()`而不是`. new()`

RSpec:为什么 `instance_double` 可以与 StandardError 一起使用,但不能与其他异常类一起使用?

使用 Ruby,我如何访问和比较这些嵌套的数组值?

为什么数组中的 splat 如此昂贵?

在 Ruby 中,rescue语句可以嵌套在哪些 struct 中

使用 RSpec 存根 Time.now

冒号:和粗箭头=>有什么区别

Ruby 中的 STDIN 和 $stdin 有什么区别?

Ruby:如何卸载设计(uninstall Devise)?

jekyll 调试或打印所有变量

删除 Ruby 数组中的 nil 和空白字符串

Sinatra 是多线程的吗?

`respond_to?` 与 `respond_to_missing?`

通过 x 个字符在 Ruby 中获取子字符串

如何理解 strptime 与 strftime

如何在没有警告的情况下重新定义 Ruby 常量?

为什么表达式 (true == true == true) 会产生语法错误?

使用哈希值呈现 ERB 模板

如何使用 Ruby 删除回车?