2012-03-14 3 views
5

내 코드 전체에 해시를 적용하기 위해 {key: 'value'} 구문을 사용하여 Ruby gem을 작성하고 있습니다. 내 테스트는 모두 1.9.x에서 이루어졌지만, 당연히 1.8.7에서는 syntax error, unexpected ':', expecting ')'이되었습니다.Ruby 1.8에서의 Ruby 1.9 해시 구문 지원

1.8.x를 지원하는 모범 사례가 있습니까? 이전 친구 =>을 사용하여 코드를 다시 작성해야합니까, 아니면 더 나은 전략이 있습니까?

+1

Ruby 1.8이 곧 사라질 것입니다. 당신은 그것을지지 할 필요가 없습니다. – sawa

+3

그것은 대중적인 의견입니까? 나는 확실히 다른 보석 제작자들이하고있는 것에 대한 의견을 찾고있다. Ruby 커뮤니티에서 1.9 열차를 모두 사용하게하는 큰 힘이 있다는 것을 알고 있습니다. 나는 개인적으로 1.8을 남겨두고 신경 쓰지 않는다. – JackCA

답변

16

나는 당신이 운이 좋다면 1.8을 지원하기를 원한다면 =>을 써야한다고 생각합니다. 평소와 같이, 나는 당신이 1.9에서 어떤 경우에 =>를 사용해야 언급합니다 :

  1. 을 키 기호가 아닌 경우. 어떤 객체 (기호, 문자열, 클래스, 수레, ...)도 루비 해시의 키가 될 수 있습니다.
  2. 인용 할 기호가 필요한 경우 : :'this.that'.
  3. MongoDB를 꽤 많이 사용한다면 :$set => hash이나 $set: hash과 같은 것을 사용할 것입니다. 구문 오류입니다.

정기적으로 프로그래밍되는 프로그래밍으로 돌아갑니다.

왜 나는 운이 없다고 말합니까? 해시 리터럴 구문 (둘 다)은 파서에 하드 배선되어 있으며 파서를 사용자의 보석에서 패치하는 것은별로 행운이 없다고 생각합니다. Ruby 1.8.7's parse.y이 말을 가지고

assoc : arg_value tASSOC arg_value 
      { 
       $$ = list_append(NEW_LIST($1), $3); 
      } 
     ; 

tASSOC=> 때문에 해시 리터럴은 하드 유선 =>를 사용할 수있는 것입니다.

assoc : arg_value tASSOC arg_value 
      { 
      /*%%%*/ 
       $$ = list_append(NEW_LIST($1), $3); 
      /*% 
       $$ = dispatch2(assoc_new, $1, $3); 
      %*/ 
      } 
     | tLABEL arg_value 
      { 
      /*%%%*/ 
       $$ = list_append(NEW_LIST(NEW_LIT(ID2SYM($1))), $2); 
      /*% 
       $$ = dispatch2(assoc_new, $1, $2); 
      %*/ 
      } 
     ; 

우리는 다시 지방 화살표 구문 (arg_value tASSOC arg_value)와 자바 스크립트 스타일 (tLABEL arg_value)가; 1.9.3's이 말한다 AFAIK, tLABEL은 또한 JavaScript 스타일 구문과 함께 어떤 종류의 기호 (:$set, 아니 :'this.that', ...)도 사용할 수없는 제한 사항의 근원입니다. 현재 트렁크 parse.y은 해시 리터럴에 대해 1.9.3과 일치합니다.

그래서 해시 리터럴 구문은 파서에 하드 와이어되어 1.8을 지원하려면 굵은 화살표가 붙어 있습니다.

+0

매우 친절하고 철저한 대답, 뮤. JS 스타일 구문을 사용하는 인스턴스를 다시 작성해야하는 것처럼 보입니다. 레거시 코드를 작성하지 않고 레거시 버전을 지원할 수있는 방법이 있었으면 좋겠다. 이 방법이 최선의 방법 일 수 있습니다. – JackCA

1

Ruby 1.8.7은 새로운 해시 구문을 지원하지 않습니다.

당신이 필사적으로 루비의 비 YARV의 C 기반 구현에 대한 해시 구문을해야하는 경우가있다 당신이

rvm install ruby-head --branch ruby_1_8 ; rvm ruby-head 
ruby -v 
ruby 1.8.8dev (2011-05-25) [i386-darwin10.7.0] 

하지만 1.9로 업그레이드를 할 can 있도록 완전히 지원되지 않는 1.8 헤드 지점입니다가는 길입니다 가기.

+0

나는 JackCA의 의도가 Ruby 1이라는 보석을 제공하는 것이라고 생각한다.8 명의 사용자가 사용할 수 있지만, JackCA는 Ruby 1.8을 사용하지 않습니다. 그래서 이것이 도움이 될 것이라고 생각하지 않습니다. – sawa