Ruby 2.0发布已经有一段时间了,网上也有大量关于2.0新特性的文章。但是这些文章似乎遗漏了一些特性,因此有了下面的内容。
1. 现在所有的常量均支持 ||= 和 &&=
在Ruby 1.8和1.9中,常量的行为和变量一样,但并非所有都是如此。这是比较可悲的。
- >> A = nil; A ||= 1; p A
- -e:1: warning: already initialized constant A
- 1
- >> A = 1; A += 1; p A
- -e:1: warning: already initialized constant A
- 2
- >> ::B ||= 1
- -e:1: constant re-assignment
注意,在最后一种情况下,常量甚至之前没有定义。
在Ruby 2.0中,允许我们自由使用。
但是请不要在你的代码中这样使用。
2. 更好的消歧符号和hash标签
在Ruby 1.9中,会提示以下代码存在语法错误:
- >> if false; else p:bar end
- -e:1: syntax error, unexpected tLABEL
- if false; else p:bar end
- ^
但是在Ruby 2.0中可以解析:
- >> if false; else p:bar end
- :bar
- => :bar
但是也请不要在代码中使用这个特性。
3. 在方法主体中使用BEGIN{}会显示错误
Ruby 1.8:
- >> def f; BEGIN{}; end
- -e:1: BEGIN in method
- def f; BEGIN{}; end
- ^
Ruby 1.9:
- >> def f; BEGIN{}; end
- -e:1: syntax error, unexpected keyword_BEGIN
- def f; BEGIN{}; end
- ^
Ruby 2.0:
- -e:1: BEGIN is permitted only at toplevel
- def f; BEGIN{}; end
- ^
请不要依赖这个特性或使用BEGIN来写代码。
4. 遮蔽块变量声明现在可以跨多行
Ruby 1.9:
- >> m { |a
- ;b| }
- -:1: syntax error, unexpected '\n', expecting '|'
Ruby 2.0:
5. 其他
Ruby 1.9:
- >> m () {}
- -e:1: syntax error, unexpected ')'
- m () {}
- ^
Ruby 2.0:
建议在专家指导下使用该特性。
原文:Unmentioned Features of Ruby 2.0 |