分配符号如何工作 - Ruby



在Ruby中,如果我只分配一个局部变量。

sound = "bang". 

这是一种main.sound=("bang")方法吗? 如果是这样,在哪里以及如何定义该方法"sound="? 或者该任务是如何工作的? 如果不是,实际发生了什么?

我知道对于二传手方法,你会说 x.sound=("bang")。 并且您正在使用参数"bang"在对象"x"上调用方法"sound="。 并且您正在创建一个实例变量"声音"。

我可以想象所有这些。 但当您在"主"对象中分配变量时则不然。 据我所知,它不是 Object 类的实例变量...... 还是吗?我很困惑。

在大多数编程语言中,包括Ruby,赋值是一种奇怪的野兽。 它不是一个方法或函数,它的作用是将一个名称(也称为左值,因为它位于赋值的左侧)与值相关联。

Ruby 增加了定义名称以 = 结尾的方法的功能,这些方法可以使用赋值语法调用。

属性访问器只是创建其他方法的方法,这些方法提取和分配类的成员变量。

所以基本上有 3 种方式可以查看分配:

  • 基元 = 运算符
  • 名称以 = 结尾的方法
  • 属性访问器为您生成的方法(这些是以 = 结尾的方法)

变量赋值只是创建对对象的引用,就像将狗命名为"Spot"一样。"="不调用任何方法。

@ZachSmith注释中,诸如 sound 之类的简单表达式可以引用名为"sound"的局部变量或名为"sound"的self方法。为了解决这种歧义,Ruby 将标识符视为局部变量,如果它"看到"了对变量的先前赋值。

这是一个main.sound=("bang")方法吗?

不。 main.sound="bang"应设置实例变量或该变量的元素。
使用dot(main.sound)告诉对象做一些方法(在本例中为sound)。

要管理局部变量 Ruby,请创建新作用域。

class E
  a = 42
  def give_a
    puts a
  end
  def self.give_a
    puts a
  end
  binding 
end
bin_e = _ # on pry
E.give_a     # error
E.new.give_a # error

两种方法都不知道a.创建类后,a将很快消失,并被垃圾回收器删除。但是,您可以使用binding方法获取该值。它将本地范围保存到某个地方,您可以将其分配给变量。

bin.eval "a" # 42

lambda具有定义它们的范围:

local_var_a = 42
lamb = ->{puts local_var_a} 
lamb.call() # 42

最新更新