赋值符号是如何工作的 - Ruby

时间:2014-01-05 13:54:53

标签: ruby variable-assignment attr-accessor

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

sound = "bang". 

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

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

我可以想象所有这些。但不是在“主”对象中分配变量时。据我所知,它不是Object类的实例变量......或者是它?我很困惑。

3 个答案:

答案 0 :(得分:6)

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

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

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

所以基本上有3种方法可以看出作业:

  • the primitive = operator
  • 名称以=
  • 结尾的方法
  • 属性访问器为您生成的方法(这些方法以=结尾)

答案 1 :(得分:1)

变量赋值只是创建对象的引用,比如命名狗" Spot"。 " ="没有任何方法。

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

答案 2 :(得分:0)

  

是一个main.sound =(“bang”)方法吗?

没有。 main.sound="bang"应设置实例变量或该变量的元素 使用点(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