包含模块时是否有使用间接的优势(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的方法 当进一步的优势出现 >方法acts_as_csv比仅包含InstanceMethods更精细> acts_as_csv接受一个参数,例如acts_as_csv:separator => “” (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 我在VAj3.5里导入了jaxp的*.jar文件,但我用了org.xml.sax.
- c# – 使所有datagridview列可排序
- C#中使用Interlocked进行原子操作的技巧
- ORACLE JET Basic Table Selection
- [Swift]LeetCode1163. 按字典序排在最后的子串 | Last Subs
- uitableview – 使用Swift的“使用未解析的标识符”
- Cocos2d 动作使用
- C# 在PDF中创建和填充域
- Cocos2d-x学习笔记(十一)-------->Cocos2d-x的内存管理
- c# – Windows应用商店流StreamSoket DataReader.LoadAsync