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

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

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

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

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

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

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

我们再次使用fat-arrow语法( arg_value tASSOC arg_value )和JavaScript样式( tLABEL arg_value ); AFAIK, tLABEL也是对各种符号(no :$set ,no :'this.that' ,…)的限制的来源,可以与JavaScript风格的语法一起使用。 当前的trunk parse.y与Hash文字的1.9.3匹配。

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

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