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

Jac*_*kCA 5 ruby syntax hash backwards-compatibility ruby-1.8

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

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

mu *_*ort 16

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

  1. 如果键不是符号.请记住,任何对象(符号,字符串,类,浮点数......)都可以是Ruby Hash中的键.
  2. 如果你需要一个你引用的符号::'this.that'.
  3. 如果你使用MongoDB几乎任何你会使用的东西,:$set => hash但是$set: hash语法错误.

回到我们定期安排的节目.

为什么我说你运气不好?Hash文字语法(它们都是)在解析器中是硬连线的,我认为你不会从你的gem中修补解析器.Ruby 1.8.7parse.y有这样的说法:

assoc    : arg_value tASSOC arg_value
             {
                 $$ = list_append(NEW_LIST($1), $3);
             }
         ;
Run Code Online (Sandbox Code Playgroud)

tASSOC=>这样的散列文字被硬连线使用=>.1.9.3说:

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);
             %*/
             }
         ;
Run Code Online (Sandbox Code Playgroud)

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

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