ruby - 包含模块时使用间接有优势吗(来自 7 周内的 7 种语言,Ruby 第 3 天)

标签 ruby inheritance module metaprogramming

Bruce 在“七周学习七种语言”中给出了以下示例,Ruby 第 3 天,第 38 页:

module ActsAsCsv
  def self.included(base)
    base.extend ClassMethods
  end

  module ClassMethods
    def acts_as_csv
      include InstanceMethods
    end
  end

  module InstanceMethods
    def read
       #fill @csv_contents and @headers from file self.class.to_s.downcase + '.txt'
    end

    attr_accessor :headers, :csv_contents

    def initialize
      read
    end
  end
end

class RubyCsv
  include ActsAsCsv
  acts_as_csv
end

m = RubyCsv.new
puts m.headers.inspect
puts m.csv_contents.inspect

我看不到 def self.included(base)ClassMethods 使用间接寻址的任何原因。与简单地包含模块 InstanceMethods 相比,上述代码是否有优势?


详细说明:“简单地包含模块 InstanceMethods”是指以下代码:

  module InstanceMethods #defined as above
    def read
       #fill @csv_contents and @headers from file self.class.to_s.downcase + '.txt'
    end

    attr_accessor :headers, :csv_contents

    def initialize
      read
    end    
  end

class RubyCsv
  include InstanceMethods
end

m = RubyCsv.new
puts m.headers.inspect
puts m.csv_contents.inspect

因为鸭子类型,这不是和通过 base.extend ClassMethods 一样好吗?

最佳答案

原始代码允许您这样做:

class A
  include ActsAsCsv
end

class B < A
  acts_as_csv
end

虽然在这种情况下使用继承更像是一个品味问题,但如果

  • 除了 acts_as_csv 之外,还将添加更多方法,类似于 A
  • ActsAsCsv 应该包含在一个类中,该类继承了许多类(比如某种 BaseModel)

  • acts_as_csv 方法比仅包含 InstanceMethods 更详尽
  • acts_as_csv 接受一个参数,例如 acts_as_csv :separator => ""

关于ruby - 包含模块时使用间接有优势吗(来自 7 周内的 7 种语言,Ruby 第 3 天),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8463753/

相关文章:

javascript - 如何使用 Ruby 检测人脸?

javascript - Javascript 中的继承 - 子方法调用父方法

security - 如何禁用 NodeJs 内部模块?

Ruby URL.parse 错误

Java方法中的方法调用

ruby-on-rails - 类语法,什么时候需要或者不需要符号?

c++ - 当我们有一个模板类有模板指针时,如何使用继承

c# - 如何在 C# 中创建类列表以在循环中迭代

maven - 如何使用 war 打包选项创建 Maven 父项目

javascript - 无法使用对象文字模块模式访问变量并应用某些 CSS