在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的某些情况下使用=>
:
- 如果键不是符号。 请记住,任何对象(符号,字符串,类,浮点数……)都可以是Ruby Hash中的键。
- 如果你需要一个你引用的符号
:'this.that'
。 - 如果您使用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是要走的路。