ruby - 扩展内置类是正确的 Ruby 风格吗?

标签 ruby

我意识到这个问题对于 StackOverflow 来说可能过于哲学化,但我想知道对内置类进行基类化以扩展其功能是否被认为是“好的”Ruby 风格。

例如

class Grades < Array
  def sum
    sum = 0
    self.each do |num|
      sum += num
    end
    return sum
  end
  def avg
    self.sum/self.length
  end
end

现在,Grades 对象在构建时看起来像数组,但具有我想要访问的附加 sum 和 avg 函数。不是将 Array 作为基类而是将此功能添加到通用对象会是“更好”的样式吗?

最佳答案

是的。

一般来说,每个人都会自由地“猴子修补”Ruby 中的所有内容,从您编写的类,到比您编写的更重要的类,再到库类。

但是,一般的计算风格指南是,如果您的类什么都做,它什么都不做。您的示例有效地访问了 each()length()但是您的新 Grades 类现在公开了 每个 Array 方法,包括您可能不希望调用的方法 ~ 以及某些白痴可能有一天会去使用猴子补丁的方法!因此,如果您的 Grades 类非常公开(由您的整个程序使用),您可能需要考虑委托(delegate)。

另一条准则——在某些语言中比其他语言更适用——你永远不应该继承,除非你随后重写一个方法,以实现多态性。包括我在内的整个 Ruby 社区都喜欢自由打破的另一条规则。

关于ruby - 扩展内置类是正确的 Ruby 风格吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16504369/

相关文章:

ruby-on-rails - rails 4 : Re-Migrating all Migrations to Schema

xml - 在ruby中将任意字符串转换为xml

ruby-on-rails - Rails 遍历来自 API XML 响应的散列

ruby - 避免在 Ruby 中改变方法参数的好习惯?

Ruby compass 配置文件覆盖

ruby - 如何按两个条件对 ruby​​ 数组进行排序

ruby方法缓存性能

ruby-on-rails - Rails4 : Why resque worker is not picking up jobs

ruby - 如何将散列键用作类的方法?

ruby-on-rails - Ruby on Rails 外壳 : Why Use Caps Here?