Ruby irb 竟然不认识 新的 Hash 字面量语法

匿名 · 2013年07月25日 · 最后由 blackanger 回复于 2013年07月26日 · 3155 次阅读

下面的代码语法明明是正确的,明明能正确运行

h={abc: 123, def: 5656}

但在 irb 里输入,就始终不行 像这样,敲回车就变问号:

cj@local:$ irb
2.0.0p195 :001 > h={abc: 123, def: 5656}
2.0.0p195 :002?>   

只认识旧的语法

2.0.0p195 :004 > h={:abc=>123,:def=>566}
 => {:abc=>123, :def=>566} 

@5long 提示,原来是 :def 这个 key 名称会被 irb 当成 def 关键字

这分析能力也太弱了

因为 def 是关键字。irb 在解析这一行输入时以为你还没写完。把 def 这一组 key-value 拿掉就支持了...

irb(main):001:0> h={abc: 123, def: 5656}
irb(main):002:1> 
匿名 #3 2013年07月25日

#1 楼 @5long 。。。果然这样。。。这分析能力也太弱了

ruby 2.0 + pry 表示可以

用这些命名去做 key,可是坑哦

如果是我,不用 foo, bar 我都不好意思出来见人。

pry 是可行的 irb 是不行的 但是一般遇到关键字 还是写成:class :def 这样最好...

啥都没想就直接拷贝到 irb 里边,然后还在惊讶是不是有什么玄机。自认分析能力全无。。。

尽量不要用 Ruby 的保留字来定义变量方法之类,这不是一个程序员该干的事。 👎

匿名 #10 2013年07月26日

#9 楼 @blackanger #6 楼 @lgn21st 。。。于是 irb 一辈子都没发现这个 bug,从此就一直和 Ruby 小公主过着幸福的生活

命名变量是不行,但关键字定义方法完全没问题,不需要刻意避免...

(1..3).begin
(1..3).end
1.class

关键字用来做 hash key 也完全没问题

''.encode 'utf-8', undef: :replace
validate ... if: lambda{ ... }

#11 楼 @luikore 你不觉得影响了可读性吗

#12 楼 @blackanger 前面有个 ., 谁都看得出来是方法...

#13 楼 @luikore 是这样的。可能是我看着别扭吧。 😏

需要 登录 后方可回复, 如果你还没有账号请 注册新账号