Ruby 2.0 Preview 1发布,正式版将于2013年2月发布

Ruby 2.0的发布经理Yusuke Endoh宣布了如下几件事:Ruby 2.0.0的直接特性已经冻结,Preview 1发布,正式版的发布日期是2013年2月24日。届时正是Ruby的20周年纪念日,因此2.0版本选择这个时间发布也非常合适。

新特性的总结可以在Ruby的NEWS文件及其问题跟踪系统中找到。所有特性之中,Keyword Argument(关键字参数)和Refinement对Ruby程序员的影响是最大的:

Keyword Argument

不同于仅仅传递一个哈希值作为方法参数,Ruby 2.0将完全支持关键字参数。下面是选自Ruby自身单元测试程序的一个代码片段:

def f1(str: "foo", num: 424242)
  [str, num]
end

def test_f1
  assert_equal(["foo", 424242], f1)
  assert_equal(["bar", 424242], f1(str: "bar"))
  assert_equal(["foo", 111111], f1(num: 111111))
  assert_equal(["bar", 111111], f1(str: "bar", num: 111111))
  assert_raise(ArgumentError) { f1(str: "bar", check: true) }
  assert_raise(ArgumentError) { f1("string") }
end 

注意该特性只能用于有默认值的参数。关于新语法的更多例子以及新语法如何使用传统参数,请参考Ruby的单元测试。

Refinement

refinement的目标是通过减少补丁的应用范围使打动态补丁(monkey patching)更为安全。下面是由Matz给出的一个例子,MathN模块包含进来之后“/”操作符才能在Fixnum上使用:

module MathN
  refine Fixnum do
    def /(other) quo(other) end
  end
end

class Foo
  using MathN

  def foo
    p 1 / 2
  end
end

Yehuda Katz写了一篇详细的博客文章来介绍如何将Refinement应用于实践之中。Refinement目前已包含在Ruby 2.0分支中,但仍然可能因性能问题而被踢除(参见 最初请求特性的讨论)。

InfoQ有机会对Yusuke Endoh做了一次访谈,向他了解了Ruby 2.0的更多信息。

InfoQ:你认为对用户而言Ruby 2.0最大的变化是什么?

refinement 是Ruby语言最基本的新特性,为Ruby的模块带来了一个新概念。很多人可以利用这一特性来替换“打动态补丁(monkey-patching)”的不良实践。请注意,该特性仍然处于演进之中,也就是说,本身还不够完善(unrefined)。随着我们相关经验的增加,它会更加成熟。(当然,我们会尽可能地尊重兼容性。)

keyword argument 则是最抢眼的特性。事实上,这远非“最大的”特性;它不过是一个语法糖。但是从实践的角度看,该特性可以让代码更简洁。

Enumerator#lazy 是懒惰的程序员(也就是熟悉函数式编程的那些人)长期以来的一个梦想。该特性用于列表的惰性求值。

Module#prepend 很可能是(隐式)使用得最多的特性。通过模块的使用,可以用一种更为整洁的机制替换Rails中“methodaliaschain”这种不够干净的用法。

如果打算详细学习这些特性的话,请参考Akira Matsuda在RubyConf上的讲座。

当然,Ruby的性能也有所改进。对于那些对新特性不感兴趣的人而言,这可能是最有意思的变化了。

InfoQ:从1.9升级到2.0会比从1.8到1.9的升级更容易吗?

我们相信所有“正常”的程序不需修改即可工作。在设计2.0时,我们就对与1.9的源代码级兼容性非常小心。

然而,还是有一些小的变化。我们认为这不会引起实际的兼容性问题,但我们也有可能错了。如果在官方发布之前知道了存在的问题,我们会重新考虑的。

所以,请尝试一下预览版本和候选版本,并报告发现的问题。对于您的反馈,我们非常感激。

InfoQ:你能指出用户可能遇到的一些潜在的不兼容问题吗?

前面也提到了,确实有一些小的不兼容问题。这些问题在NEWS文件中有相应说明。比如:

  • Object#respond_to? 对于受保护方法默认返回false。
  • Kernel#system和 #exec默认情况下不继承非标准的文件描述符。
  • Object#inspect默认不调用#to_s。

通过总结从预览版本和候选版本得到的反馈,我们希望为官方2.0.0版本制作一个简单的升级指南。

Yusuke也提到了性能的改进。为了降低Ruby的内存使用量,2.0版本中将会包含一个新的位图标记垃圾回收器(Bitmap Marking GC)(可以参考InfoQ对其开发者Narihiro Nakamura的访谈)。如果你想了解该垃圾收集器的工作原理,请参考这篇关于Ruby的垃圾收集的好文章。

下面是一些有意思的新特性与重要修改,它们将是Ruby 2.0的一部分:

  • Dtrace探针,支持运行时剖析应用
  • Enumerable#lazy,能够在Enumerable上惰性执行操作
  • 改进的正则库Onigmo,支持Perl 5.10中引入的一些新特性
  • Method移植,允许将模块方法移植到其他模块或类中
  • Module#prepend,支持前置模块以便使前置方法覆盖现有方法
  • Object#respond_to? ,不会再检查 受保护方法
  • CGI中的HTML5支持

请下载Ruby 2.0.0-preview1版本并让我们知道你的想法!

查看英文原文:Ruby 2.0 Preview 1 Released, Final Release in February 2013

感谢姚琪琳对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至[email protected]。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

你可能感兴趣的:(Ruby 2.0 Preview 1发布,正式版将于2013年2月发布)