gpt4 book ai didi

ruby - parens 出现奇怪的语法错误

转载 作者:数据小太阳 更新时间:2023-10-29 06:30:42 25 4
gpt4 key购买 nike

除了作为最后一个参数的散列之外,您可以在 Ruby 中在方法调用时去掉括号并获得一致的结果(您仍然需要注意优先级)。

但是,我遇到了一个不是这样的例子:

''.split(/ ./) # => []
''.split /./ # => []
''.split / ./ # !> SyntaxError: unexpected '.'

这是错误/回归(我用 2.1.2 -> 2.4.1 Rubys 测试过)吗?

还有其他一般情况下删除括号不能按预期工作吗?


Reported it ,让我们看看。


更新:票被拒绝的有点含糊。目前尚不清楚它是否是错误,但它不会得到修复,建议在这些情况下使用 %r{}。原因确实是开头的斜杠被解释为除法。

最佳答案

除了thesecretmaster's answer ,让我们深入了解 Ruby 解析器:

require 'ripper'
require 'pp'

pp Ripper.lex("''.split /./")
# [[[1, 0], :on_tstring_beg, "'" ],
# [[1, 1], :on_tstring_end, "'" ],
# [[1, 2], :on_period, "." ],
# [[1, 3], :on_ident, "split"],
# [[1, 8], :on_sp, " " ],
# [[1, 9], :on_regexp_beg, "/" ],
# [[1, 10], :on_tstring_content, "." ],
# [[1, 11], :on_regexp_end, "/" ]]

添加空格使 Ruby 将 / 字符识别为除法运算符:

pp Ripper.lex("''.split / ./")
# [[[1, 0], :on_tstring_beg, "'" ],
# [[1, 1], :on_tstring_end, "'" ],
# [[1, 2], :on_period, "." ],
# [[1, 3], :on_ident, "split"],
# [[1, 8], :on_sp, " " ],
# [[1, 9], :on_op, "/" ],
# [[1, 10], :on_sp, " " ],
# [[1, 11], :on_period, "." ],
# [[1, 12], :on_op, "/" ]]

Are there other generic cases where dropping the parens doesn't work as expected?

人为的例子:

def foo(i = 1)
10 * i
end

foo(- 2) #=> -20
foo - 2 #=> 8

另一个:

b = 2
def a(arg)
arg
end

a *b #=> 2

a = 5

a *b #=> 10

第一个 a *b 被解释为 a(*b),而第二个变成 a * b。添加括号会强制 Ruby 调用该方法:

a(*b)   #=> 2

关于ruby - parens 出现奇怪的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43046927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com