2

Railsの本でAvdiのオブジェクトを読んでいますが、サンプルコードのセクションがわかりません。

彼は次のようなクラスを作成します。依存性注入の目的で推測します。

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

それから彼は次のスペックを書きます

# spec/models/blog_spec.rb
require 'ostruct'
describe Blog do
  # ...
  describe "#new_post" do
    before do
      @new_post = OpenStruct.new
      @it.post_source = ->{ @new_post }
    end
    it "returns a new post" do
      @it.new_post.must_equal @new_post
    end
    it "sets the post's blog reference to itself" do
      @it.new_post.blog.must_equal(@it)
    end
  end
end

彼がなぜ使うのか分かりません@it.post_source = ->{ @new_post }

@it.post_source = OpenStruct.public_method(:new)なぜ彼は、ブログのクラスコードに似たようなものを使用しなかったのですか?@post_source ||= Post.public_method(:new)

これには理由がありますか?

4

2 に答える 2

2

->{ @new_post }@new_post に格納されているインスタンスを返すラムダです。

Post.public_method(:new)Post のコンストラクタメソッドを返します

クラスが使用するラムダを渡すと、返されるインスタンスを制御できます。クラスのコンストラクターを渡すということは、それがどのインスタンスを取得するかわからないことを意味し、指定したクラスになるだけです。

于 2012-06-01T12:20:44.977 に答える
0

仕様のリファレンスを提供します。そうでない場合、ブロックit内で比較できませんでした。これは、テスト容易性を容易にするためit "returns a new post"に、メソッドで許可されている単純な依存性注入メカニズムを使用します。post_source

于 2012-06-01T11:16:29.377 に答える