2013-02-19 4 views
6

간단히 말해서 옵션 인수가 포함 된 메서드를 작성했습니다. key의 값 : if, true로 평가됩니다. 나는 새로운 구문을 사용하여 IRB에 해시를하려고 할 때 내가 IRB에 구문 오류가 발생했습니다 프롬프트 숙박을 엽니 다IRB - Ruby 1.9.x 해시 구문 : {if : true}가 {: if => true}와 같지 않음

1.9.3p374 :010 > {if: true} 
1.9.3p374 :011?> 

오래된 구문을 사용하여 작품을 잘 :

1.9.3p374 :011 > {:if => true} 
=> {:if=>true} 

모든 키워드를 그 성명서를 시작하고 같은 행동을한다. 예 : def, do, module, 중간에 발생 case

다른 예약 된 단어와 잘 class 일 : else, end

내 질문이 예상되는 동작, 버그의 한계인가?

+2

'irb'는 약간 약해서 상당한 양의 뇌 손상이 있습니다. 아마도 그 중 일부가 보일 것입니다. –

+0

@muistooshort 매우 근거없는 것 같습니다. 'echo 'puts {if : true} .inspect'> test.rb; ruby test.rb'는 다음을 반환합니다 :'test.rb : 1 : 예기치 않은 구문 오류 ':''irb'는 어떤 식으로 깨지기 쉽니 까? – nzifnab

+2

@nzifnab Irb는 'end'까지 명령문 실행을 보류해야하며, 제어 연산자를 잘못 해석하면 (여기 에서처럼) 고유 한 추가 문제가 있습니다. – coreyward

답변

6

모든 언어로 믿을 수 있고 모호하지 않게 해석하는 것은 쉽지 않습니다. 예약어를 사용하기 시작할 때 특히 그렇습니다. 그리고 irb은 그 이상으로 파서의 상단에 대화 형 모델을 제공해야합니다.이 모델은 더 어렵습니다. 저는 개인적으로 언어 사용자 나 관리자로서 걱정하는 것에 너무 많은 가치가 있다고 생각하지 않습니다. 내 마음 속에서, 단순히 작동하는 것을 알아 내고 가능한 경우 이러한 상황에 빠지지 않는 것이 좋습니다.

평범한 루비에서는 irb 외부에서 비슷한 동작을 볼 수 있습니다. 예를 들어 :

puts({if: true}) # no problem, behaves as expected in Ruby 1.9.3. 
puts {if: true} # raises a syntax error in Ruby 1.9.3 

가 귀하의 질문에 대답하려면, "예상 된 동작, 버그 또는 제한"을, 나는 당신이 irb을 무시하고 일반 루비와 비교해야한다고, 그리고 것입니다 당신은이 작업을 수행 할 경우, 그것을 잘 작동합니다. 즉, irb 버그 여야합니다.

하지만 해결할 가치가 있습니까? @coreyward는 이 if을 만날 때 대부분의 경우 실행을 지연해야한다는 그의 의견에 좋은 점을 제시합니다. 확실하게 알기 위해서는 더 자세히 살펴야하지만, 이와 같은 모든 경우를 모호하지 않게 해석 할 수는 없습니다.

내 조언 : 가능한 경우이 구문을 모두 사용하지 마십시오. 사용하지 않을 경우 레이블에 예약어를 사용하지 마십시오!

다음은 일반 Ruby (예 : MRI)에서 실행할 수있는 파일입니다. 출력에 {:if=>true}이 나타나야 제대로 작동하는지 확인할 수 있습니다.

{if: true} 
foo = {if: true} 
# if MRI is working, should be able to execute this file without trouble. 
p foo 
+1

과제를 소개하면 모든 것이 예상대로 작동한다는 점도 주목할 가치가 있습니다. 예 :'foo = {if : true}'는 MRI에서 정상적으로 평가됩니다 (IRB는 여전히 트립되지만). – coreyward

+0

@coreyward : 참으로. 나는 이것을 시도했다. 명확한 답변을 위해 코드 블록을 추가하겠습니다. 감사! – Peter

+1

매우 흥미 롭습니다. OP의 예제는 루비 스크립트에서든 IRB에서든 실패합니다.하지만 puts 주위에 괄호를 던지면 작동합니다. 얼마나 혼란스러워! 나는 거의 그들이 해시 로켓만을 독점적으로 붙잡고 싶다. 이해하기가 훨씬 쉬워지고 잡티가 훨씬 적습니다. (그리고 모든 해시는 문자열 키를 사용하는 해시 대신 동일합니다. 예약 된 레이블을 사용하는 해시는 로켓을 사용합니다! 기호는 때때로 레이블 구문을 사용해야합니다.) – nzifnab