【问题标题】:Difference between Refinements and redefine class in rubyruby 中 Refinements 和 redefine 类的区别
【发布时间】:2018-01-09 13:29:57
【问题描述】:

我正在阅读一些关于 ruby​​ 编程语言的书,并且想知道这样的东西是如何工作的

class String
  def word_count
    frequencies = Hash.new(0)
    downcase.scan(/\w+/) { |word| frequencies[word] += 1 }
    return frequencies
  end
end

我知道有一个内置字符串,我来自 (C++) 顺便说一句,所以创建 class string 会在定义对象 string x = new string() 时产生歧义,我搜索了一下,发现一些概念被命名为 @987654324 @ 允许我们修改和添加函数到 String 类,我看到它们使用关键字 refine 来制作这些东西(根据文档),但是我的问题来了,当我把上面的类放在irb 并开始像 "amr adel".word_count 那样测试它,它给了我正确的结果,我预计一开始不会工作,所以如果它有效,为什么我什至可以在我的代码中使用 refine 为什么我不只创建一个与内置类同名的类,并添加附加功能和修改功能,这种方式是否隐式进行细化过程?

我承认 ruby​​ 很棒而且很容易使用,但我想知道事情的进展。

如果您可以参考一些文章或其他内容,将不胜感激 谢谢

【问题讨论】:

  • 主要的混淆点可能是使用上面的代码,您不是创建一个名为String 的新类,它有效地隐藏了核心String 类。相反,实际发生的是您正在更改单核 String 类并添加一个新方法。因此,该方法将适用于每个字符串。这是由于 Ruby 中的一个重要概念,称为“开放类”。 Refinements 的相当新的概念是试图确保此类扩展不会污染全局命名空间,例如当不同的库各自尝试添加word_count 方法时。
  • 哦,现在更清楚了,非常感谢@HolgerJust

标签: ruby overriding refinements


【解决方案1】:

来自the ruby documentation

您可以在顶层、类内部和 模块。您不能在方法范围内激活细化。 改进 在当前类或模块定义结束之前被激活, 如果在顶层使用,则直到当前文件的末尾。

改进的全部意义(而不是仅仅扩展一个核心类)是它们是作用域

在您上面的代码中,String#word_count 将被定义在任何地方 - 例如,如果您有多个文件。

另一方面,如果您将该方法定义为细化,那么它只会在您明确using 的地方定义。

这样做的动机是您可以在一个位置添加/更改行为,而不会影响其他地方的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2012-05-25
    • 1970-01-01
    • 2011-04-29
    • 2012-09-07
    • 2013-03-27
    相关资源
    最近更新 更多