新的 Ruby 1.9 哈希语法

6
new_hash = {:simon => "Talek", :lorem => "Ipsum"}

可以被替换为

new_hash = {simon: "Talek", lorem: "Ipsum"}

有没有更简短的写法呢?

:on => :collection

应用相同的逻辑会导致错误:
on: :collection

Update to provide more info:

In my routes.rb:

get 'detail', { on: :member } 

无法工作。也不会工作

get 'detail',  on: :member 

错误:

Exiting
SyntaxError: C:/Workspace/OE_11/CyberTrack_Rails3/config/routes.rb:23: 
  syntax error, unexpected ':'

      get 'detail', { on: :member }

或者

Exiting
SyntaxError: C:/Workspace/OE_11/CyberTrack_Rails3/config/routes.rb:23: 
  syntax error, unexpected ':'

      get 'detail', on: :member

请提供一个完整的示例,说明您要做什么。 :on => :collection本身没有意义。 - Dominik Honnef
2
这个可以正常工作吗?在IRB(Ruby 1.9.2)中,对于我来说{on: :collection}会产生{:on=>:collection} - Jeremy Roman
你是如何尝试使用它的?对我来说,它很好用,如 h = {on: :collection} - D_Bye
在我的routes.rb文件中:get 'detail', { on: :member } 给我报错了。 - Lieven Cardoen
你能提供比“引发错误”更详细的信息吗?是哪个错误?在哪里? - Jörg W Mittag
完全无关的问题:我是否检测到了OpenEdge 11路径?您是否在对OpenEdge数据库运行Rails?如果是这样,能否分享一些ORM层的细节?我正在编写一个DataMapper适配器,所以我有点好奇。 - Abe Voelker
3个回答

4
这对我来说完全没问题:
def get(*args) p *args end

get 'detail', on: :member
# "detail"
# { :on => :member }

RUBY_ENGINE
# => jruby
JRUBY_VERSION
# => 1.6.6

编辑:现在你提供了错误信息,看起来你没有运行Ruby 1.9。新的哈希语法是在Ruby 1.9中引入的,在旧版本中不起作用。你需要确保你正在运行Ruby 1.9,可以通过验证你是否运行了正确的Ruby实现(例如YARV支持1.9,MRI不支持),或者如果你正在运行支持多种语言版本的Ruby实现(例如JRuby),则需要传递正确的命令行标志(例如jruby --1.9)。


奇怪。我正在使用JRuby 1.6.6...也许它不支持新的Ruby语法? - Lieven Cardoen
1
你是否在1.9模式下运行JRuby? - Dominik Honnef
JRuby 1.6.6支持1.8.7p357和1.9.2p312,所以它应该可以工作。 (事实上,我知道它可以工作,并且至少已经工作了几年,因为我已经使用它很长时间了。)但是显然只有在1.9模式下运行才有效。 - Jörg W Mittag
你如何在1.8模式而非1.9模式下运行它? - Lieven Cardoen
1
@LievenCardoen: jruby --1.9 - Jörg W Mittag

1

正如其他人所提到的,您需要使用1.9版本才能使此语法正常工作。将环境变量JRUBY_OPTS设置为--1.9将确保您正在使用正确的Ruby版本。


-1

action: 'edit':action => 'edit'都是语法错误。你只能在方法的最后一个参数中传递没有括号的哈希。在其他所有情况下,请使用{action: 'edit'}

为了使其工作,您必须运行ruby 1.9+:get 'detail',{on::member}


如果哈希是集合中的最后一个参数,您只能将没有括号的哈希传递给方法。无论如何,OP做对了。 - jibiel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接