在Ruby 1.8中支持Ruby 1.9的哈希语法 [英] Supporting Ruby 1.9's hash syntax in Ruby 1.8

查看:167
本文介绍了在Ruby 1.8中支持Ruby 1.9的哈希语法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在整个代码中使用 {key:'value'} 语法来为散列写一个Ruby gem。我的测试全部通过1.9.x,但我(可以理解)在1.8.7中得到语法错误,意外的':',期待')'



是否有支持1.8.x的最佳做法?我需要用旧朋友 => 重写代码,还是有更好的策略? >解决方案

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


  1. 如果密钥不是符号。请记住,任何对象(符号,字符串,类,浮动,...)都可以成为红宝石哈希中的一个键。

  2. 如果你需要一个你会引用的符号::'this.that'

  3. 如果您使用MongoDB的任何东西,您将使用诸如 :$ set =>散列但是 $ set:散列是语法错误。

返回我们定期编程的程序。



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

我们再次使用胖箭头语法( arg_value tASSOC arg_value )和JavaScript风格( tLABEL arg_value ); AFAIK, tLABEL 也是限制什么类型的符号的来源(不是:$ set ,no :'this.that',...)可以与JavaScript风格的语法一起使用。当前主干 parse.y 匹配哈希文字的1.9.3。

因此,哈希文字的语法是硬编码的,连接到解析器中,如果你想支持1.8,你就会被胖箭头卡住。


I'm writing a Ruby gem using the {key: 'value'} syntax for hashes throughout my code. My tests all pass in 1.9.x, but I (understandably) get syntax error, unexpected ':', expecting ')' in 1.8.7.

Is there a best practice for supporting the 1.8.x? Do I need to rewrite the code using our old friend =>, or is there a better strategy?

解决方案

I think you're out of luck, if you want to support 1.8 then you have to use =>. As usual, I will mention that you must use => in certain cases in 1.9:

  1. If the key is not a symbol. Remember that any object (symbols, strings, classes, floats, ...) can be a key in a Ruby Hash.
  2. If you need a symbol that you'd quote: :'this.that'.
  3. If you use MongoDB for pretty much anything you'll be using things like :$set => hash but $set: hash is a syntax error.

Back to our regularly scheduled programming.

Why do I say that you're out of luck? The Hash literal syntaxes (both of them) are hard-wired in the parser and I don't think you're going to have much luck patching the parser from your gem. Ruby 1.8.7's parse.y has this to say:

assoc    : arg_value tASSOC arg_value
             {
                 $$ = list_append(NEW_LIST($1), $3);
             }
         ;

and tASSOC is => so hash literals are hard-wired to use =>. 1.9.3's says this:

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);
             %*/
             }
         ;

We have the fat-arrow syntax again (arg_value tASSOC arg_value) and the JavaScript style (tLABEL arg_value); AFAIK, tLABEL is also the source of the restrictions on what sorts of symbols (no :$set, no :'this.that', ...) can be used with the JavaScript-style syntax. The current trunk parse.y matches 1.9.3 for Hash literals.

So the Hash literal syntax is hard-wired into the parser and you're stuck with fat arrows if you want to support 1.8.

这篇关于在Ruby 1.8中支持Ruby 1.9的哈希语法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆