Ruby:如何消除“警告:'*'解释为参数前缀”?

Yas*_*oji 5 ruby splat

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

hash = {"a" => 1,
        "b" => 2,
        "s" => 3,}

if "string".start_with? *hash.keys then
  puts "ok"
else
  puts "ng"
end
Run Code Online (Sandbox Code Playgroud)

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

$ ruby -w /tmp/a.rb
/tmp/a.rb:5: warning: `*' interpreted as argument prefix
ok
Run Code Online (Sandbox Code Playgroud)

解决此警告的最佳方法是什么?

我试图hash像这样把括号括起来:

hash = {"a" => 1,
        "b" => 2,
        "s" => 3,}

if "string".start_with? (*hash.keys) then
  puts "ok"
else
  puts "ng"
end
Run Code Online (Sandbox Code Playgroud)

然后您得到:

$ 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
Run Code Online (Sandbox Code Playgroud)

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

我的红宝石版本是:

$ ruby --version
ruby 2.3.3p222 (2016-11-21) [x86_64-linux-gnu]
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 6

如果要使用方法调用括号,则必须避免在方法名称和左括号之间放置空格:

if "string".start_with?(*hash.keys)
  puts "ok"
else
  puts "ng"
end
Run Code Online (Sandbox Code Playgroud)

另外,它then是过时的,因此我们会假装从未有过。如果方法名称和左括号之间有空格,则您的括号将被解释为expression-grouping-括号,这就是语法错误的出处。

一旦添加了方法调用括号,您就可以消除关于您的含义的任何歧义暗示,*并且警告应消失。


顺便说一句,在这种情况下,您得到的警告相当愚蠢。再次考虑,警告并不是那么愚蠢,因为Ruby可以以令人惊讶的方式对空格敏感。这个:

o.m *x
Run Code Online (Sandbox Code Playgroud)

可以解释为:

o.m(*x)
Run Code Online (Sandbox Code Playgroud)

或为:

o.m() * x
Run Code Online (Sandbox Code Playgroud)

但是这些:

o.m * x
o.m*x
o.m* x
Run Code Online (Sandbox Code Playgroud)

可以用相同的方式解释。当然,这三者均被解释为o.m() * x且仅o.m *x被视为o.m(*x)。理智的空白使用将表明o.m *x明显一个图示,而o.m * x明显倍增,但对SO几天应该说服你,空白的使用是很难理智或一致的。

话虽如此,-w现实世界中的输出往往如此庞大且嘈杂,-w几乎没有用。