逗号有时不是多余的吗?

时间:2012-03-11 22:28:14

标签: ruby comma

在Ruby中,从语言规范中删除了许多其他语言所需但被认为是多余的东西。其中一个重要的例子是分号。除非你想连续发表声明,否则你可以省略分号。

但是还有另一个角色我通常觉得多余,而且在Ruby中仍然需要。那是逗号。在某些情况下,逗号是不是冗余,即,当方法参数或数组元素或散列元素连续放在同一行上时,或者当它们被一对括号包围时,即使它们位于不同的行上?为什么Ruby不能像shell脚本一样没有逗号,并且只能选择性地使用它们来指示方法参数/数组元素/哈希元素继续到下一行?如果Matz继续选择分号,他为什么不用逗号来表达呢?

我投票结束的{p> This question让我思考这个问题。

1 个答案:

答案 0 :(得分:4)

没有理由无法

Haskell没有方法参数的逗号,尽管它用于数组元素分隔。

Smalltalk根本没有逗号,因为它们存在于Ruby中。鉴于Ruby受Smalltalk的影响,似乎添加逗号是一种刻意的语言选择。 (然后,Smalltalk的参数列表样式更像是使用参数传递哈希,但仍然是逗号。)

但是,Ruby确实有使用文字的无逗号数组:

%w[I don't have any commas!]  #=> ["I", "don't", "have", "any", "commas!"]

最后,我认为要问的问题是,是否让逗号更清晰,更容易解析。例如,这有多清楚:

foo bar baz

那是foo (bar baz)还是foo (bar (baz))?或者甚至可能((foo) bar) baz)(尽管这在非功能性语言中可能没有多大意义)?虽然显然知道无论优先级是什么都可以让你弄明白这一点,但这也意味着你可能需要更频繁地包含括号,而使用逗号则差别很明显:

foo bar baz   # foo(bar(baz))
foo bar, baz  # foo(bar, baz)

显然,在Ruby中省略括号有时也会导致歧义,但通常会导致语法错误,而不是依赖于事物的优先级。

最终,这是Matz等人的语言选择。没有理由不这样做,这正是他们认为最有意义的。