Ruby:我怎么能杀掉"警告:`*'解释为参数前缀"?

时间:2017-01-24 06:42:45

标签: ruby splat

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

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

这就是Why does white-space affect ruby function calls?中描述的问题,显然不是解决我试图修复警告的方法。

我的红宝石版本是:

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

1 个答案:

答案 0 :(得分:3)

如果你打算使用方法调用括号,那么必须避免在方法名称和左括号之间加一个空格:

String

此外,if "string".start_with?(*hash.keys) puts "ok" else puts "ng" end 相当古老,所以我们假装从来没有。如果方法名称和左括号之间有空格,则括号将被解释为表达式分组括号以及语法错误来自的位置。

添加方法调用括号后,您可以删除任何可能含糊不清的关于then应该是什么意思的暗示,并且警告应该消失。

顺便说一句,在这种情况下,你所得到的警告是相当的,嗯,愚蠢。第二个想法,警告并不是那么愚蠢,因为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。 Sane空白用法表明o.m(*x) 明显是一个splat而o.m *x 显然是一个乘法但是SO上的几天应该说服你那个空格用法难以理解或保持一致。

那就是说,o.m * x在现实世界中的输出往往是如此庞大而嘈杂,以至于-w几乎无用。