在红宝石中细化和重新定义类之间的区别



我正在读一些关于 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(),我搜索了一下,我发现一些概念被命名为refinement它允许我们修改和添加函数到类String我看到他们使用关键字refine来制作这些东西(根据文档), 但是我的问题来了,当我只是把上面的类放在irb上并开始像那个"amr adel".word_count一样测试它时,它给了我正确的结果,我一开始预计不会工作, 所以如果它有效,为什么我什至可以在我的代码中使用refine为什么我只创建一个与内置类同名的类并放置附加函数和修改函数, 这种方式是否隐式地执行优化过程?

我承认 Ruby 很棒,而且很容易使用,但我想知道事情还在继续。

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

来自 ruby 文档:

您可以在顶级和内部类中激活优化,并且 模块。不能激活方法范围内的优化。优化将一直激活到当前类或模块定义结束,或者在顶级使用,直到当前文件结束。

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

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

另一方面,如果您将该方法定义为优化,则只会在您显式using它的地方定义它。

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

最新更新