【问题标题】:Do ruby gems ever conflict?红宝石宝石是否会发生冲突?
【发布时间】:2011-03-21 11:10:08
【问题描述】:

作为一个红宝石新手,我想知道,宝石会不会相互冲突?例如,如果 2 个 gem 覆盖了数组上的

谢谢

【问题讨论】:

    标签: ruby rubygems monkeypatching


    【解决方案1】:

    我假设您在谈论重新定义方法,而不是覆盖它们,对吧?如果两个库在两个不同的子类中覆盖相同的方法,则不会有任何问题。

    如果两个或多个库重新定义了相同的方法,那么最后加载的那个会胜出。实际上,这实际上与 one 库重新定义一个方法没有什么不同:Ruby 解释器为您提供了 Array#<< 的实现,如果您重新定义它,您的定义就会获胜,因为它来了稍后。

    阻止这种情况的最佳方法很简单:不要到处乱用现有方法。并且不要使用这样做的库。启用警告的-w 命令行标志在那里非常有用,因为至少在 Ruby 1.9.2 中,如果方法被重新定义,它会打印一个警告。

    在 Ruby 2.0 中,可能会有某种机制将方法(重新)定义隔离到某种命名空间中。不过,我不会屏住呼吸:这些所谓的selector namespaces 已经在 Ruby 社区中讨论了近 10 年,在 Smalltalk 社区中甚至比这更长,而且 AFAIK 没有人产生过有效的实现甚至是 Ruby 的工作设计。一个较新的想法是Classboxes 的想法。

    【讨论】:

      【解决方案2】:

      据我所知,您说的是猴子补丁(在 ruby​​ 社区中也称为打鸭子)。

      This article 有另一个猴子补丁(和其他做法)变坏的例子。

      【讨论】:

      • 打鸭对我来说是新的,呵呵。
      【解决方案3】:

      实际上,不,但如果你真的尝试过,你可能会构建出这样的情况。这是一个interesting article(虽然很旧),它解释了这是如何发生的。

      如果两个 gem “覆盖数组上的

      【讨论】:

      • 实际上,它也发生在实践中。我们有这样的经验,有两个 gem 重新定义了 Symbol 类的相同方法(一个是 Sequel,另一个我现在不记得了)。不,您不必在 Ruby 中继承一个类来重新定义它的方法。
      • 您不必子类化一个类来重新定义方法,但您必须重写它们,这就是问题所在。但你是对的,我误解了这个问题。
      • 我认为在 Ruby 中重写和重新定义方法没有区别,只是命名约定——如果你在继承的类中这样做,你就是在“重写”,如果你在它已在其中定义的类,您正在“重新定义”。
      猜你喜欢
      • 2011-05-28
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多