我正在读一本名为RailsAntiPatterns的书。在下面的converter
方法中,实例化了一个新的OrderConverter
对象,我假设self
指的是Order
类的实例。
# app/models/order.rb
class Order < ActiveRecord::Base
def converter
OrderConverter.new(self)
end
end
# app/models/order_converter.rb
class OrderConverter
attr_reader :order
def initialize(order)
@order = order
end
def to_xml # ...
end
def to_json # ...
end
def to_csv # ...
end
def to_pdf # ...
end
end
self
需要作为参数传递? 答案 0 :(得分:2)
为什么要在转换器中实例化一个新类?
当然,这取决于作者的选择,但它可能很方便。例如:
@my_order = Order.new
@my_order.converter.to_xml
这读起来相当不错,这在Rubyist眼中很重要。作为Ruby的原始设计师,Yukihiro Matsumoto(Matz)有said:
因此,如果您希望生成优雅的Ruby代码,那么人类的可读性非常重要。但实际上我们需要关注人类,关注人类如何关注编程或操作机器的应用。我们是主人。他们是奴隶。
为什么&#34;自我&#34;需要作为参数传递吗?
很简单,OrderConverter需要转换订单。由于方法converter
是为Order类的实例定义的,因此希望转换自身的实例会将self
作为参数传递给OrderConverter #new。
你能用非专业的术语概括发生了什么吗?
我希望上面已经为你做了这件事。
答案 1 :(得分:1)
这里没有太多事情发生。
def converter
OrderConverter.new(self)
end
此方法创建一个新的OrderConverter
并返回它。 OrderConverter
传递了对Order
(self
)的引用,可用于执行其工作(转换)。
基本上就是这样。
答案 2 :(得分:1)
OrderConverter的构造函数将Order的一个实例作为其第一个参数。
关于“为什么”的问题,就Ruby而言,没有真正的答案,这取决于实现者-i.e.作者 - 代码实际上做了什么。