2017-01-24 7 views
3

다음 코드에서 "warning :`* '인수로 해석 된 접두사"를 제거 할 수 있습니까? 나는 위의 코드를 실행하면Ruby : "warning :`* '을 인자 접두사로 해석하면 어떻게 죽일 수 있습니까?

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 = {"a" => 1, 
     "b" => 2, 
     "s" => 3,} 

if "string".start_with? (*hash.keys) then 
    puts "ok" 
else 
    puts "ng" 
end 

는 당신이 얻을 :

나는이 같은 hash 주위에 괄호를 넣어 시도했습니다

$ 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,이 질문은 fr 접미사 이름과 괄호 사이의 공백이 아니라 인수 접두어 경고에 관한 것입니다. –

답변

3

는 메소드 호출-괄호를 사용하려고하는 경우 다음 메소드 이름과 여는 괄호 사이에 공백을 넣어 해야 피하십시오 :

if "string".start_with?(*hash.keys) 
    puts "ok" 
else 
    puts "ng" 
end 

또한 then은 오히려 구식이므로 결코 존재하지 않는 척합니다. 메서드 이름과 여는 괄호 사이에 공백이 있으면 괄호는 expression-grouping-parentheses로 해석되며 구문 오류가 발생합니다.

메서드 호출 괄호를 추가하면 *이 무엇을 의미하는지에 대한 모호한 힌트가 제거되고 경고가 사라져야합니다.


BTW, 당신이이 경우에 받고있는 경고는, 음, 오히려 바보입니다. 두 번째 생각에, Ruby가 공백에 놀라게 될 수 있기 때문에 경고는 그리 바보가 아닙니다. 이 :

o.m(*x) 

또는 :

o.m *x 

는 다음과 같이 해석 될 수

o.m() * x 

그러나이 : ​​

o.m * x 
o.m*x 
o.m* x 

이 같은 방법으로 해석 될 수 있습니다. 물론, 이들 3 개 모두가 o.m() * x으로 해석되고 o.m *x만이 o.m(*x)으로 보여집니다. 공백 문자 사용은 o.m *x이고, 이 인데 반해,은 분명히입니다. 따라서 곱하기는 충분하지만 공휴일 사용은 공백 사용이 거의 안정적이지 않거나 일관성이 없음을 확신시켜야합니다.

즉, 현실 세계에서 -w의 출력은 부피가 크고 시끄러운 경향이있어서 -w은 거의 쓸모가 없습니다.