【问题标题】:Ruby && and = operators misudnerstandingRuby && 和 = 运算符的误解
【发布时间】:2017-02-09 20:17:18
【问题描述】:

你认为 Ruby 中的下一个表达式会产生什么结果?

    a = 10 && b = 25

尝试在ming中计算,然后才使用irb。因此,如果我们查看有关 Operators Precedence 的 Ruby 文档,我们会发现 && 运算符的优先级高于 =。所以你一定认为 Ruby 会以下面的方式计算表达式:

    a = ((10 && b) = 25)

但 Ruby 以另一种方式发挥作用:

    a = (10 && (b = 25))
    # => 25

所以,b = 25 中的= 的优先级更高,然后是&&。谁能解释一下为什么会这样?

【问题讨论】:

  • “一定认为 ruby​​ 会这样做:((10 && b) = 25)” - 不。这没有任何意义。 = 的左侧在这里不是可分配的实体。

标签: ruby operators operator-precedence


【解决方案1】:

这与 Ruby 识别裸词标识符

的方式有关

当遇到像a这样的标识符时,它必须通过检查它是关键字、局部变量还是方法的顺序来解决它.

  • keyword - 如果 a 是关键字,则将其用作关键字
  • local variable - a 右边是否有等号,那么一定是局部变量。如果不检查是否定义了任何局部变量a。这几点非常重要,这就是为什么在没有显式调用self的情况下不能在实例方法中调用编写器方法的原因。

以这段代码为例

class Person
  attr_accessor :name #creates both attr_reader name & attr_writer name=(text)

  def print_name
    name # => attr_reader method name is called and returns nil

    name = 'Bola'#even though we have the name= method, it doesn't get called
    #what happens is a local variable name is created instead
    #this is as a result of how ruby interpreted the bareword identifier name
    #not a keyword but has an equal sign so must be a local variable

    name # this time local variable is used instead of method because it is resolved first
  end
end
  • method 如果它没有被解析为关键字或局部变量,那么它会假定它是一个方法并尝试调用它。

这就是代码的评估方式

  • && 10 左边是什么,它可以理解
  • 10&& 右侧的b 进行比较,但它必须评估b 是什么所以它使用我上面描述的过程来解决它,这会导致局部变量@987654335 @。赋值操作总是返回它们右边的值,即25
  • 比较1025,返回25
  • 最后一个=25

话虽如此,&& 确实具有更高的优先级,= 标志具有相同的优先级。希望这个解释清楚。

【讨论】:

  • 这很有帮助,谢谢。问:当你说“比较1025时,你不只是检查两者是否为真,在这种情况下,后者总是在Ruby中返回,而不是比较?
  • 它检查值是否为truthy。在 Ruby 中,唯一不真实的值是 falsenil。只需在比较表达式中将除falsenil 之外的任何值都解释为truelatter 不一定返回,如果是 false && 2525 && falsefalse 将被返回。我很高兴这能够提供帮助。 :)
  • @sagarpandya82:返回的是“最后评估值”。这与“列表中的最后一个值”不同(因为短路)
猜你喜欢
  • 2013-07-04
  • 1970-01-01
  • 2011-01-15
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多