【问题标题】:Ruby: How can I kill "warning: `*' interpreted as argument prefix"? [duplicate]Ruby:我怎样才能杀死“警告:'*'解释为参数前缀”? [复制]
【发布时间】:2017-06-08 20:45:11
【问题描述】:

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

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]

【问题讨论】:

  • @AlexGolubenko,这个问题是关于参数前缀警告,而不是函数名称和括号之间的空格。
  • 我同意雅舒师的观点。人们在堆栈溢出上找到答案的主要方法是谷歌警告。如果他们有这个问题,他们不会用谷歌搜索why does white space affect ruby function calls,因为这样做意味着他们已经知道是什么导致了警告。我认为应该删除重复的标签。

标签: ruby splat


【解决方案1】:

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

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 被视为o.m(*x)。理智的空白使用表明o.m *x显然是一个splat,而o.m * x显然是一个乘法,但是几天的SO应该让你相信空白的使用几乎不是理智的或一致。

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

【讨论】:

    猜你喜欢
    • 2017-01-15
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 2021-03-04
    • 1970-01-01
    • 2022-01-06
    • 2016-11-24
    相关资源
    最近更新 更多