优化与重新定义红宝石中的类别之间的区别

时间:2018-01-09 13:29:57

标签: ruby override refinements

我正在阅读一本关于ruby编程语言的书,并想知道这样的事情是如何起作用的

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

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

我承认ruby太棒了,很容易合作,但我想知道事情还在继续。

如果您可以推荐某些文章或其他内容,我们将非常感激 感谢

1 个答案:

答案 0 :(得分:2)

来自the ruby documentation

  

您可以在顶级和内部类中激活优化   模块。您可能无法激活方法范围中的细化。的加细   被激活,直到当前类或模块定义结束   或直到当前文件的结尾(如果在顶级使用)。

改进的整点(与仅扩展核心类相反)是作用域

在上面的代码中,String#word_count将被定义为无处不在 - 例如,如果您有多个文件。

另一方面,如果您将该方法定义为细化,那么它只会在您明确 using 的位置定义。< / p>

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