2012-03-14 78 views
5

我正在使用{key: 'value'}語法編寫Ruby代碼,用於散列在我的代碼中。我的測試全部通過1.9.x,但我(可以理解)在1.8.7中獲得syntax error, unexpected ':', expecting ')'在Ruby 1.8中支持Ruby 1.9的哈希語法

是否有支持1.8.x的最佳做法?我需要使用我們的老朋友=>重寫代碼,還是有更好的策略?

+1

Ruby 1.8即將淡出。你不需要它的支持。 – sawa 2012-03-14 02:46:21

+3

這是一個流行的意見?我當然在尋找關於其他寶石作者正在做什麼的意見。我知道在Ruby社區中有很大的推動力讓每個人都能在1.9列車上。我個人不介意讓1.8落後。 – JackCA 2012-03-14 02:53:13

回答

16

我覺得你運氣不好,如果你想支持1.8,那麼你必須使用=>。像往常一樣,我會提到,您必須在1.9的某些情況下使用=>

  1. 如果密鑰不是符號。請記住,任何對象(符號,字符串,類,浮動,...)都可以成爲Ruby哈希中的一個鍵。
  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=>所以哈希文字是硬連線使用=>1.9.3's這樣說:

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)和JavaScript樣式(tLABEL arg_value); AFAIK,tLABEL也是限制什麼樣的符號(沒有:$set,沒有:'this.that',...)可以與JavaScript風格的語法一起使用的來源。當前中繼線parse.y匹配哈希文字的1.9.3。

所以如果你想支持1.8,那麼哈希文字的語法被硬連接到解析器中,並且你被胖箭頭卡住。

+0

非常好,徹底的答案,畝。看起來我可能不得不重寫使用JS風格語法的實例。只希望有一種方法可以在不編寫遺留代碼的情況下支持舊版本。儘管這可能是最好的選擇。 – JackCA 2012-03-14 02:56:03

1

Ruby 1.8.7不支持新的哈希語法。

如果你迫切需要對紅寶石的非YARV基於C語言實現的哈希語法,有一個完全不支持1.8蓋分支,所以你can

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是必經之路走。

+0

我認爲JackCA的意圖是提供一個Ruby 1的寶石。8用戶可以使用,而不是說JackCA正在使用Ruby 1.8。所以我不認爲這會有所幫助。 – sawa 2012-03-14 17:50:59