【问题标题】:Why does code written in Ruby 2.1 have to be parsable by Ruby 2.0 interpreter?为什么用 Ruby 2.1 编写的代码必须能够被 Ruby 2.0 解释器解析?
【发布时间】:2013-12-26 01:18:28
【问题描述】:

在 Ruby Core 中,已经为 Ruby 2.1 提出了一种用于冻结字符串的新文字符号 "foo"f,但 now 人们担心以这种语法编写的代码无法被 Ruby 2.0 解析。为什么这是个问题? Ruby 不是只尝试向后兼容吗?也就是说,如果用 Ruby 2.0 编写的代码可以被 Ruby 2.1 解释器解析,那还不够吗?为什么用 Ruby 2.1 编写的代码必须能够被 Ruby 2.0 解释器解析?

【问题讨论】:

  • @muistooshort:首先:该语法在 2.0 中是非法的,因此它不是一个重大更改。为 2.0 编写的所有代码在 2.1 中仍然有效。其次,即使它重大更改,像 2.1 这样的新的主要版本正是应该发生。
  • @muistooshort:我认为您对 Ruby 版本控制政策感到困惑。 Ruby 有一个由 4 部分组成的版本号:W.X.Y-pZ。 Z 是一个补丁版本,只允许修正错误。 Y 是次要版本,允许向后兼容的新功能。 X 是一个主要版本,向后兼容性可能会被破坏。 W 是一个划时代的版本,为 Ruby 语言历史上具有里程碑意义的里程碑保留:0.x → 1.x 是第一个生产就绪版本,1.x → 2.x 是 Ruby 20 周年。 2.0 → 2.1 是一个主要版本,因此,允许进行重大更改……但这甚至不是重大更改!
  • @muistooshort:没有代码可能会被此更改破坏,因为该语法是非法。时期。所以,即使这个 次要版本(它不是,2.0.1 将是次要版本),它仍然 没问题,因为它是 不是重大更改,因为没有代码可以中断。

标签: ruby literals ruby-2.0 string-literals ruby-2.1


【解决方案1】:

这是一个很好的问题。我关注核心 ML 有一段时间了,我认为这里的主要问题是新的冻结文字语法是语法变化,而不仅仅是功能变化。

让我稍微扩展一下答案。首先,让我们记住,我们谈论的是次要版本更改,它不应该破坏与以前代码的兼容性。事实上,您可能会争辩说,事实上,这根本不会发生。 Ruby 2.0 代码在 Ruby 2.1 中可以正常工作,但不能相反。

您还提到暗示新版本可能包含以前版本中不可用的功能。但我相信这正是问题的根源所在。

新语法不仅引入了功能更改,还引入了语法更改。这意味着,如果您尝试向 Ruby 2.0 解析器提供 Ruby 2.1 代码,它可能会失败。由于我们已经知道的所有原因(兼容性、迁移、维护等),这可能不是一个好主意。

这与在 Ruby 2.1 中创建一个 Ruby 2.0 不可用的新方法时完全不同。在这种情况下,确实 2.1 会比 2.0 拥有更多的功能,但是如果您使用相同的代码库提供以前的解释器,它就不会抱怨。你没有改变语言语法,你只是丰富了核心库。而且,在这种情况下,很容易让您的 2.0 代码更类似于 2.1:只需实现缺少的方法即可。

这在语法更改时是不可能的,因为您需要重新实现解析器。

如果您查看您在这一点下的 Ruby 更改,您会发现在次要版本之间引入了非常少的语法更改。

像 stubby lambda、关键字参数、新的哈希表示法这样的变化,它们都是在引入时带来了重大影响。

一般来说,语法级别的更改与功能级别的更改相比可能会导致更多的维护问题。这是我对新冻结文字语法背后的原因以及它们最终使用.freeze instead of the new syntax 的原因的解释。 freeze 已经存在于之前的 Ruby 版本中,但即使它们带有全新的方法,方法也不会在解析时进行评估,并且可以轻松地向后移植。

【讨论】:

    【解决方案2】:

    我想到的答案是:

    • 更轻松地从 ruby​​ 2.0 迁移到 2.1
    • ruby 版本之间共享代码
    • 人们似乎觉得 f 后缀丑陋/令人困惑

    迁移

    当两个 ruby​​ 版本都可以解析语法时,从 2.0 迁移到 2.1 就少了一项任务。无需任何更改,现有代码可能会受益于更好的冻结字符串处理。

    ruby 版本之间的共享代码

    使用类似的语法,您可以编写与多个 ruby​​ 版本(2.0 和 2.1)一起使用的 ruby​​ 代码(尤其是库)。这为库开发人员提供了更多的受众(并且为不同的 ruby​​ 版本维护的版本更少)。然而,图书馆用户可以更轻松地从 ruby​​ 2.0 迁移到 2.1。 ruby 2.1 版本仍然可以从更好的冻结字符串处理中受益。

    个人口味

    通过阅读 ruby​​ 错误跟踪器,我发现有些人似乎觉得新语法丑陋/令人困惑。以下是一些示例:

    还有其他人喜欢新语法。嗯,这是主观的,但我们想知道为什么人们会抱怨,所以这是一个重点:)

    【讨论】:

    • 您的论点适用于任何类型的新增功能,在 2.0 和 2.1 之间有很多。我认为它不能解释为什么冻结的字符串文字会成为问题。
    • 当然。然而,这是一个新特性,有两种可能的实现方式——一种兼容,另一种不兼容。所以我们有一个选择。如果有选择,就会有讨论。另外,headius 在他的帖子中提到了其他原因(除了 2.0 兼容性)(但你没有问过这些)。
    猜你喜欢
    • 2010-12-20
    • 2010-10-11
    • 2011-12-29
    • 1970-01-01
    • 2017-08-01
    • 2012-03-26
    • 2012-01-30
    • 2011-04-21
    • 1970-01-01
    相关资源
    最近更新 更多