gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:09:37 26 4
gpt4 key购买 nike

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

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

最佳答案

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

  1. 如果键不是一个符号。请记住,任何对象(符号、字符串、类、 float ……)都可以是 Ruby 哈希中的键。
  2. 如果你需要一个你会引用的符号::'this.that'
  3. 如果您将 MongoDB 用于几乎任何事情,您将使用诸如 :$set => hash 之类的东西,但是 $set: hash 是一个语法错误。<

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

为什么我说你运气不好? Hash 文字语法(它们两者)在解析器中是硬连接的,我认为您从 gem 中修补解析器不会有太多运气。 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 的哈希文字。

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

关于ruby - 在 Ruby 1.8 中支持 Ruby 1.9 的哈希语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9694209/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com