【问题标题】:Why this code is not compiling on ruby 1.9 but is on ruby 1.8?为什么这段代码不在 ruby​​ 1.9 上编译,而是在 ruby​​ 1.8 上编译?
【发布时间】:2012-11-18 08:26:09
【问题描述】:

不好意思题主,不知道这个语法是怎么调用的。

例如:

ary = [ [11, [1]], [22, [2, 2]], [33, [3, 3, 3]] ]
# want to get [ [11, 1], [22, 2], [33, 3] ]

红宝石 1.8

ary.map{|x, (y,)| [x, y] }
#=> [[11, 1], [22, 2], [33, 3]]

ary.map{|x, (y)| [x, y] }
#Syntax error, unexpected '|', expecting tCOLON2 or '[' or '.'
#ary.map{|x, (y)| [x, y] }
#                ^

红宝石 1.9

ary.map{|x, (y,)| [x, y] }
#SyntaxError: (irb):95: syntax error, unexpected ')'
#ary.map{|x, (y,)| [x, y] }
#                ^

ary.map{|x, (y)| [x, y] }
#=> [[11, 1], [22, 2], [33, 3]]

我不是在寻求获得想要的数组的方法。

我想知道为什么这段代码是 Ruby 的版本之一,而不是两者都可以工作

【问题讨论】:

    标签: ruby ruby-1.9 ruby-1.8


    【解决方案1】:

    虽然 Ruby 1.9 对列表中的尾随逗号和类似列表的表示形式比以前的版本要宽松得多,但在一些新情况下它会引发语法错误。这似乎是一个。 Ruby 1.9 将其严格地视为方法定义,并且不允许使用杂散逗号。

    您似乎还遇到了 Ruby 1.8.7 中已更正的边缘情况错误。列表扩展方法似乎不适用于仅一项。

    这种情况下的快速解决方法可能是:

    ary.map{|x, (y,_)| [x, y] }
    

    在这种情况下,_ 用作 whatever 变量。

    在这两个版本中你都应该得到:

    [[11, 1], [22, 2], [33, 3]]
    

    【讨论】:

    • 如果Ruby 1.8中需要尾随逗号,是否意味着某种规则消失了?
    • 我认为它不需要太多,因为它回避了问题。整个块参数语义在 1.9 中得到了巨大的改革。现在支持具有默认值和*args 类型的可选参数。这种不允许包含一个项目的列表,但不关心第二个是否实际命名的古怪行为似乎已被删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    相关资源
    最近更新 更多