2012-03-14 16 views
5

Piszę klejnotowy Ruby używając składni {key: 'value'} dla skrótów w całym kodzie. Moje testy przechodzą w wersji 1.9.x, ale ja (co zrozumiałe) otrzymuję syntax error, unexpected ':', expecting ')' w 1.8.7.Obsługa składni skrótu Rubiego w Ruby 1.8

Czy istnieje dobra praktyka w zakresie obsługi 1.8.x? Czy muszę przepisać kod za pomocą naszego starego znajomego =>, czy jest lepsza strategia?

+1

Ruby 1.8 wkrótce zniknie. Nie potrzebujesz do tego wsparcia. – sawa

+3

Czy to jest popularna opinia? Z pewnością szukam informacji na temat tego, co robią inni autorzy Gem. Wiem, że w społeczności Rubiego istnieje spora presja, aby wszyscy wsiedli do pociągu 1.9. Osobiście nie mam nic przeciwko pozostawieniu 1.8 za sobą. – JackCA

Odpowiedz

16

Myślę, że nie masz szczęścia, jeśli chcesz wspierać 1.8, musisz użyć =>. Jak zwykle wspomnę, że musisz użyć => w niektórych przypadkach w 1.9:

  1. Jeśli klucz nie jest symbolem. Pamiętaj, że każdy obiekt (symbole, łańcuchy, klasy, obiekty pływające, ...) może być kluczem w Ruby Hash.
  2. Jeśli potrzebujesz symbolu, który cytujesz: :'this.that'.
  3. Jeśli używasz MongoDB do prawie wszystkiego, będziesz używał rzeczy takich jak :$set => hash, ale $set: hash jest błędem składni.

Powrót do naszego regularnie zaplanowanego programowania.

Dlaczego mówię, że nie masz szczęścia? Składnia literacka Hasha (obie) jest mocno osadzona w parserze i nie sądzę, że będziesz miał dużo szczęścia załatania parsera ze swojego klejnotu. Ruby 1.8.7's parse.y ma do powiedzenia:

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

i tASSOC jest => tak hash literały są podłączone na stałe do korzystania =>. 1.9.3's mówi tak:

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); 
      %*/ 
      } 
     ; 

Mamy składnię tłuszcz strzałki ponownie (arg_value tASSOC arg_value) oraz styl JavaScript (tLABEL arg_value); AFAIK, tLABEL jest również źródłem ograniczeń, jakie symbole (no :$set, no :'this.that', ...) mogą być używane ze składnią w stylu JavaScript. Obecny bagażnik parse.y dopasowuje 1.9.3 dla literałów skrótu.

Tak więc składnia literacka skrótu jest podłączona do parsera i utknąłeś w grubych strzałkach, jeśli chcesz wspierać 1.8.

+0

bardzo ładna i dokładna odpowiedź, mu. Wygląda na to, że mógłbym przepisać wystąpienia, w których używam składni stylu JS. Po prostu chciałbym mieć sposób na wsparcie starszych wersji bez pisania starszego kodu. To może być jednak najlepszy zakład. – JackCA

1

Ruby 1.8.7 nie obsługuje nowej składni skrótu.

Jeśli rozpaczliwie potrzebują skrótu składni sprawie realizacji c oparte non-YARV Ruby, jest całkowicie nieobsługiwane 1,8 szef oddziału, więc can zrobić

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

ale uaktualnienie do 1,9 jest sposobem udać się.

+0

Myślę, że intencją JackCA jest zapewnienie klejnotu, który jest Rubinem 1.8 użytkowników może używać, nie, że JackCA używa Ruby 1.8. Więc nie sądzę, że to pomoże. – sawa

Powiązane problemy