2017-01-24 7 views
3

Как удалить предупреждение: `* 'интерпретируется как префикс аргумента" из следующего кода?Ruby: Как я могу убить предупреждение: `* 'интерпретируется как префикс аргумента"?

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] 
+0

@AlexGolubenko, этот вопрос касается предупреждения префикса аргумента, а не пробела между именем функции и скобкой. –

ответ

3

Если вы собираетесь использовать метод-колл-круглые скобки, то вы необходимо избежать ввода пробела между именем метода и открывающей скобки:

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очевидно a splat тогда o.m * xочевидно умножение, но через пару дней на SO должно убедить вас в том, что использование пробелов вряд ли является разумным или последовательным.

Это означает, что выход -w в реальном мире имеет тенденцию быть настолько объемным и шумным, что -w почти бесполезен.