Ruby:我怎样才能杀死"warning: `*' interpreted as argument prefix"?
Ruby: How can I kill "warning: `*' interpreted as argument prefix"?
如何从以下代码中删除 "warning: `*' interpreted as argument prefix"?
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 版本是:
$ ruby --version
ruby 2.3.3p222 (2016-11-21) [x86_64-linux-gnu]
如果你打算使用 method-calling-parentheses 那么你 必须 避免在方法名称和左括号之间放置 space:
if "string".start_with?(*hash.keys)
puts "ok"
else
puts "ng"
end
此外,then
相当陈旧,因此我们假装它从未存在过。如果方法名称和左括号之间有一个 space,那么您的括号将被解释为 expression-grouping-parentheses,这就是您的语法错误的来源。
添加 method-calling-parentheses 后,您就可以消除关于 *
的含义的任何可能的歧义提示,并且警告应该消失。
顺便说一句,在这种情况下,您收到的警告相当,嗯,很愚蠢。 转念一想,这个警告并不那么愚蠢,因为 Ruby可以以令人惊讶的方式对白色space 敏感。这个:
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 whitespace 用法表明 o.m *x
显然是 一个 splat,而 o.m * x
显然是 一个乘法但是在 SO 上几天应该会让你相信 whitespace 的用法很难理智或一致。
也就是说,-w
在现实世界中的输出往往过于庞大和嘈杂,以至于 -w
几乎毫无用处。
如何从以下代码中删除 "warning: `*' interpreted as argument prefix"?
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 版本是:
$ ruby --version
ruby 2.3.3p222 (2016-11-21) [x86_64-linux-gnu]
如果你打算使用 method-calling-parentheses 那么你 必须 避免在方法名称和左括号之间放置 space:
if "string".start_with?(*hash.keys)
puts "ok"
else
puts "ng"
end
此外,then
相当陈旧,因此我们假装它从未存在过。如果方法名称和左括号之间有一个 space,那么您的括号将被解释为 expression-grouping-parentheses,这就是您的语法错误的来源。
添加 method-calling-parentheses 后,您就可以消除关于 *
的含义的任何可能的歧义提示,并且警告应该消失。
顺便说一句,在这种情况下,您收到的警告相当,嗯,很愚蠢。 转念一想,这个警告并不那么愚蠢,因为 Ruby可以以令人惊讶的方式对白色space 敏感。这个:
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 whitespace 用法表明 o.m *x
显然是 一个 splat,而 o.m * x
显然是 一个乘法但是在 SO 上几天应该会让你相信 whitespace 的用法很难理智或一致。
也就是说,-w
在现实世界中的输出往往过于庞大和嘈杂,以至于 -w
几乎毫无用处。