在Ruby 1.8中支持Ruby 1.9的哈希语法

时间:2012-03-14 00:20:20

标签: ruby hash syntax backwards-compatibility ruby-1.8

我正在使用{key: 'value'}语法为我的代码中的哈希编写一个Ruby gem。我的测试全部通过1.9.x,但我(可以理解)在1.8.7中得到syntax error, unexpected ':', expecting ')'

是否有支持1.8.x的最佳做法?我是否需要使用我们的老朋友=>重写代码,还是有更好的策略?

2 个答案:

答案 0 :(得分:16)

我认为你运气不好,如果你想支持1.8那么你必须使用=>。像往常一样,我会提到你必须在1.9:

的某些情况下使用=>
  1. 如果密钥不是符号。请记住,任何对象(符号,字符串,类,浮点数......)都可以是Ruby Hash中的键。
  2. 如果您需要引用的符号::'this.that'
  3. 如果您使用MongoDB几乎可以使用:$set => hash之类的内容,但$set: hash会出现语法错误。
  4. 回到我们定期安排的节目。

    为什么我说你运气不好? Hash文字语法(它们都是)在解析器中是硬连接的,我认为你不会从你的gem中修补解析器。 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);
                 %*/
                 }
             ;
    

    我们再次使用fat-arrow语法(arg_value tASSOC arg_value)和JavaScript样式(tLABEL arg_value); AFAIK,tLABEL也是对JavaScript样式语法使用哪种符号(无:$set,无:'this.that',...)的限制的来源。当前主干parse.y与Hash文字匹配1.9.3。

    所以Hash文字语法硬连接到解析器中,如果你想支持1.8,你就会遇到胖箭头。

答案 1 :(得分:1)

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

如果你迫切需要基于非YARV c的Ruby实现的哈希语法,那么有一个完全不受支持的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是可行的方法。