2012-03-14 80 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