Rails / Ruby:不了解这种方法

时间:2012-01-04 03:59:15

标签: ruby-on-rails ruby

我正在读一本名为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
  1. 为什么要在转换器中实例化一个新类?
  2. 为什么self需要作为参数传递?
  3. 你能用非专业的术语概括发生了什么吗?

3 个答案:

答案 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传递了对Orderself)的引用,可用于执行其工作(转换)。

基本上就是这样。

答案 2 :(得分:1)

每当你从Order类调用实例方法“converter”时,他就返回一个新的OrderConverter实例(它是一个隐式返回)。

OrderConverter的构造函数将Order的一个实例作为其第一个参数。

关于“为什么”的问题,就Ruby而言,没有真正的答案,这取决于实现者-i.e.作者 - 代码实际上做了什么。