代码之家  ›  专栏  ›  技术社区  ›  Amro Abdalla

ruby中细化和重定义类的区别

  •  0
  • Amro Abdalla  · 技术社区  · 7 年前

    我正在读一些关于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 ,它给了我一个正确的结果,我原本以为不会起作用,所以如果它起作用,为什么我甚至可以使用 精炼 在我的代码中,为什么我不只创建一个与内置类同名的类,并放置额外的函数和修改函数,这是隐式地执行优化过程吗?

    我承认ruby很棒,很容易相处,但我想知道事情的进展。

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   Tom Lord    7 年前

    从…起 the ruby documentation :

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

    这个 整点 改进(而不仅仅是扩展核心类)的一个方面是 范围 .

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

    另一方面,如果将该方法定义为 精炼 那么它将只在您明确 using

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