5

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

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

4

2 回答 2

16

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

  1. 如果键不是符号。请记住,任何对象(符号、字符串、类、浮点数等)都可以是 Ruby 哈希中的键。
  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);
             }
         ;

并且哈希文字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);
             %*/
             }
         ;

我们再次拥有粗箭头语法 ( arg_value tASSOC arg_value) 和 JavaScript 样式 ( tLABEL arg_value);AFAIK,tLABEL也是限制哪些符号(no :$set、no :'this.that'、...)可以与 JavaScript 样式语法一起使用的来源。当前主干parse.y匹配 1.9.3 的哈希文字。

所以 Hash 文字语法是硬连线到解析器中的,如果你想支持 1.8,你就会被粗箭头困住。

于 2012-03-14T01:22:25.587 回答
1

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

如果您在非 YARV 基于 c 的 Ruby 实现上迫切需要哈希语法,则有一个完全不受支持的 1.8 头分支,所以您可以这样做

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 是要走的路。

于 2012-03-14T03:24:02.587 回答