7

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

sound = "bang". 

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

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

我可以想象这一切。但不是当您在“主”对象中分配变量时。据我所知,它不是 Object 类的实例变量......或者是吗?我很混乱。

4

3 回答 3

6

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

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

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

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

  • 原始 = 运算符
  • 名称以 = 结尾的方法
  • 属性访问器为您生成的方法(这些是以 = 结尾的方法)
于 2014-01-05T14:23:48.293 回答
1

变量赋值只是创建对对象的引用,例如将狗命名为“Spot”。“=”没有调用任何方法。

正如@ZachSmith 评论的那样,一个简单的表达式sound可以引用名为“sound”的局部变量或名为“sound”的方法self。为了解决这种歧义,如果 Ruby 已经“看到”了先前对变量的赋值,则 Ruby 将标识符视为局部变量。

于 2014-01-05T14:13:54.880 回答
0

那是 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

lambdas 具有定义它们的范围:

local_var_a = 42
lamb = ->{puts local_var_a} 
lamb.call() # 42
于 2014-01-05T14:39:52.120 回答