【问题标题】:how does the assignment symbol work - Ruby赋值符号如何工作 - Ruby
【发布时间】:2014-01-05 13:54:52
【问题描述】:

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

sound = "bang". 

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

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

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

【问题讨论】:

  • 这些信息不足以回答您的所有问题..
  • 背景是我在这里问的一个问题stackoverflow.com/questions/20932032/…
  • 我猜问题是“代码背后的逻辑是什么:sound = "bang"?Ruby 是如何解释的?
  • 只有sound = "bang" 可以解释为sound 是一个局部变量,或者您正在调用一个名为sound=() 的setter 方法。
  • 赋值运算符 = 不是方法,但是方法的名称可以以 = 结尾

标签: ruby variable-assignment attr-accessor


【解决方案1】:

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

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

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

所以基本上你可以通过 3 种方式查看作业:

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

【讨论】:

  • 谢谢。我想我开始有点理解我一开始不明白的是什么:p
【解决方案2】:

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

作为@ZachSmith cmets,像sound 这样的简单表达式可以引用名为“sound”的局部变量或selfnamed “sound”的方法。为了解决这种歧义,Ruby 将标识符视为局部变量,如果它“看到”了之前对变量的赋值。

【讨论】:

  • 我正在阅读一本红宝石书。说“分配只是对常规方法的调用”。在我使用的示例中,方法是“sound =”。那么它是在哪个类/对象中定义的?以及 ruby​​ 是如何定义它的,因为它显然在你调用它之前没有定义
  • @Zach Smith:Ruby 解释器正在决定代码中的名称分配是方法还是局部变量,并区别对待。
【解决方案3】:

这是一个 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

【讨论】:

    猜你喜欢
    • 2010-10-13
    • 1970-01-01
    • 2016-08-20
    • 2012-07-23
    • 2012-01-24
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 2011-05-28
    相关资源
    最近更新 更多