红宝石: 如何杀死"warning: `*' interpreted as argument prefix"?



如何从以下代码中删除"warning:`*'解释为参数前缀"?

hash = {"a" => 1,
"b" => 2,
"s" => 3,}
if "string".start_with? *hash.keys then
puts "ok"
else
puts "ng"
end

当我运行上面的代码时,我得到:

$ ruby -w /tmp/a.rb
/tmp/a.rb:5: warning: `*' interpreted as argument prefix
ok

修复此警告的最佳方法是什么?

我试着把括号放在hash周围,如下所示:

hash = {"a" => 1,
"b" => 2,
"s" => 3,}
if "string".start_with? (*hash.keys) then
puts "ok"
else
puts "ng"
end

然后你得到:

$ ruby -w /tmp/a.rb
/tmp/a.rb:5: syntax error, unexpected *
if "string".start_with? (*hash.keys) then
^
/tmp/a.rb:5: syntax error, unexpected ')', expecting '='
if "string".start_with? (*hash.keys) then
^
/tmp/a.rb:7: syntax error, unexpected keyword_else, expecting end-of-input

这就是"为什么空白会影响ruby函数调用?"中描述的问题?,显然不是解决我试图解决的警告的方法。

我的ruby版本是:

$ ruby --version
ruby 2.3.3p222 (2016-11-21) [x86_64-linux-gnu]

如果要使用方法调用圆括号,则必须避免在方法名称和开头的圆括号之间留空格:

if "string".start_with?(*hash.keys)
puts "ok"
else
puts "ng"
end

此外,then是相当古老的,所以我们将假装它从未存在过。如果方法名称和左括号之间有空格,则括号将被解释为表达式分组括号,这就是语法错误的来源。

一旦添加了调用圆括号的方法,就可以消除任何可能的*含义的模糊提示,并且警告应该消失。


BTW,在这种情况下,你得到的警告相当愚蠢仔细想想,这个警告并没有那么愚蠢,因为Ruby可以以令人惊讶的方式对空格敏感。此:

o.m *x

可以解释为:

o.m(*x)

或作为:

o.m() * x

但是这些:

o.m * x
o.m*x
o.m* x

可以用相同的方式进行解释。当然,这三个都被解释为o.m() * x,只有o.m *x被视为o.m(*x)。Sane空白的使用表明o.m *x显然是的一个splat,而o.m * x显然是一个乘法,但几天的SO应该会让你相信空白的使用很难是合理或一致的。

也就是说,-w在现实世界中的输出往往是如此庞大和嘈杂,以至于-w几乎毫无用处。

相关内容

  • 没有找到相关文章

最新更新