【发布时间】: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