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/