【问题标题】:Why does ruby interpret ++ as +@为什么 ruby​​ 将 ++ 解释为 +@
【发布时间】:2017-08-01 19:02:48
【问题描述】:

我在 irb 中得到了奇怪的输出

>> [1, 2] + + [3]
NoMethodError: undefined method `+@' for [3]:Array
    from (irb):2
    from /home/marko/.rubies/ruby-2.3.1/bin/irb:11:in `<main>'
>> [1, 2] ++ [3]
NoMethodError: undefined method `+@' for [3]:Array
    from (irb):3
    from /home/marko/.rubies/ruby-2.3.1/bin/irb:11:in `<main>'
>> 

这是故意发生的还是一个错误?
+ +转换为+@背后的逻辑是什么

【问题讨论】:

标签: ruby


【解决方案1】:

它不是将+ + 转换为+@,而是将后者+ 转换为+@,即前缀+ 运算符。因此,表达式的解析方式与[1, 2] + (+[3]) 相同。

+@ 用于表示一元加号运算符,因为+ 是为二元加号运算符保留的。)

(另外,Ruby 中没有 ++ 运算符。)

【讨论】:

  • 为什么++@ 一样?
  • 因为+ 表示二元加号运算符,而+@ 表示一元(前缀)加号运算符。
【解决方案2】:

我相信这被解析为:

[1, 2] + +[3]

错误是 Ruby 告诉我们没有正数数组的概念。

你可以用整数看到这一点。例如:

1++2  # => 3
# parsed as 1 + +2
# (obviously this is a particularly bad way to write this expression - don't do it!)

【讨论】:

    【解决方案3】:

    根据这个答案 No increment operator (++) in Ruby? Ruby 没有增量运算符,因此充其量 + + 将被解释为两个单独的运算符,从而导致意外行为。作为

    ++ 和 -- 不是 Ruby 中的保留操作符

    在尝试此操作时,Ruby gem 或其他包含的库可能会导致其他意外行为。另外值得注意的是+++ +,在像Ruby 这样的非空白敏感语言中,在功能上相同的东西将无法解析+ 运算符没有可能的单独操作。

    简而言之:Ruby 不会将+ + 解释为+@,它只是将其解释为两个独立的+ 运算符。

    【讨论】:

    • 这是误导。首先:是的,Ruby 确实 将其解释为两个独立的运算符,但它会将其解释为两个不同的 运算符:二元中缀+ 和一元前缀+。第二:对应于一元前缀+的消息称为+@,所以,是的,Ruby确实将其解释为+@,具体为[1, 2].+([3].+@())
    • 总是如此,还是仅在某些情况下如此?如果是后者,那么我对原始问题的回答是准确的,不应具有误导性,因为它涉及从特定示例而不是示例本身进行的概括 - 当然 tuple_cat 来自更有经验的开发人员的回答级别的经验值得它的支持,imo。
    猜你喜欢
    • 2010-12-20
    • 1970-01-01
    • 2018-10-12
    • 2020-01-04
    • 2011-05-09
    • 2013-01-15
    • 2021-07-30
    • 1970-01-01
    相关资源
    最近更新 更多