加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

包含模块时是否有使用间接的优势(7周内的7种语言,Ruby第3天)

发布时间:2020-12-17 02:42:47 所属栏目:百科 来源:网络整理
导读: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
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

虽然在这种情况下使用继承更多是品味问题,但如果使用继承则更加清晰

>除了act_as_csv之外,还会添加更多类似于A的方法
> ActsAsCsv应该被许多类继承的类包含(比如某种BaseModel)

当进一步的优势出现

>方法acts_as_csv比仅包含InstanceMethods更精细> acts_as_csv接受一个参数,例如acts_as_csv:separator => “”

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读