3

我正在阅读 Avdi Grimm 的书“Rails 中的对象”,他使用了 public_method 方法,但我不明白为什么。这是代码示例:

class Blog
  # ...
  attr_writer :post_source
  # ...
  private
  def post_source
    @post_source ||= Post.public_method(:new)
  end
end

为什么要调用 Post.public_method(:new) 而不是 Post.new?这些方法有什么不同还是完全相同?谢谢您的帮助。

4

2 回答 2

3
Post.new

不等于_

Post.public_method(:new)

前者是对方法的调用new,默认情况下,它会创建一个新Post对象。然而,后者不会立即调用new。它只是准备稍后调用它。我还没有读过那本书,但是如果您查看相关的源代码,您会看到这一行

@post_source.call # maybe some params are passed here

这是Post#new最终被调用的地方。

文档:Object#public_methodObject#method

于 2013-02-22T11:05:19.497 回答
2

Post.public_method(:new)并且Post.new是不同的东西。后者创建一个Post. 前者创建 的实例Method,它不是应用这种方法的结果,而是方法本身的抽象。call您可以稍后通过对其进行操作来取出它的结果。

Post.public_method(:new)可以替换为Post.method(:new),除非存在名为 的私有或受保护方法new。如果有的话,只是确保不要参考这些方法。

于 2013-02-22T11:04:54.730 回答