我正在使用{key: 'value'}
語法編寫Ruby代碼,用於散列在我的代碼中。我的測試全部通過1.9.x,但我(可以理解)在1.8.7中獲得syntax error, unexpected ':', expecting ')'
。在Ruby 1.8中支持Ruby 1.9的哈希語法
是否有支持1.8.x的最佳做法?我需要使用我們的老朋友=>
重寫代碼,還是有更好的策略?
我正在使用{key: 'value'}
語法編寫Ruby代碼,用於散列在我的代碼中。我的測試全部通過1.9.x,但我(可以理解)在1.8.7中獲得syntax error, unexpected ':', expecting ')'
。在Ruby 1.8中支持Ruby 1.9的哈希語法
是否有支持1.8.x的最佳做法?我需要使用我們的老朋友=>
重寫代碼,還是有更好的策略?
我覺得你運氣不好,如果你想支持1.8,那麼你必須使用=>
。像往常一樣,我會提到,您必須在1.9的某些情況下使用=>
:
:'this.that'
。:$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,那麼哈希文字的語法被硬連接到解析器中,並且你被胖箭頭卡住。
非常好,徹底的答案,畝。看起來我可能不得不重寫使用JS風格語法的實例。只希望有一種方法可以在不編寫遺留代碼的情況下支持舊版本。儘管這可能是最好的選擇。 – JackCA 2012-03-14 02:56:03
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是必經之路走。
我認爲JackCA的意圖是提供一個Ruby 1的寶石。8用戶可以使用,而不是說JackCA正在使用Ruby 1.8。所以我不認爲這會有所幫助。 – sawa 2012-03-14 17:50:59
Ruby 1.8即將淡出。你不需要它的支持。 – sawa 2012-03-14 02:46:21
這是一個流行的意見?我當然在尋找關於其他寶石作者正在做什麼的意見。我知道在Ruby社區中有很大的推動力讓每個人都能在1.9列車上。我個人不介意讓1.8落後。 – JackCA 2012-03-14 02:53:13