4

procの概念は理解していますが、次のようなコードが表示されることがあります(Railsガイドから検証用http://guides.rubyonrails.org/active_record_validations_callbacks.html#using-if-and-unless-with-a-procを取得):

class Order < ActiveRecord::Base
  before_save :normalize_card_number,
    :if => Proc.new { |order| order.paid_with_card? }
end

これはもっと簡単に次のように書くことができるようです:

class Order < ActiveRecord::Base
  before_save :normalize_card_number, :if => :paid_with_card? 
end

ここでProcを使用する利点について何が得られないのですか?

事前にt​​hx

4

2 に答える 2

5

単純なケースでは同等ですが、procs を使用すると、検証 if チェックのためだけにメソッドを定義する必要がなく、はるかに汎用性が高くなります。

これを想像してください:

before_save :nuke, :if => Proc.new { |model| !model.nuked? && model.nukable? && model.region.nukable? }

そのチェックはいつでもインスタンス メソッドに記述してシンボルで参照できますが、特定のロジックが :if のみにある場合は、proc に保持することが有効です。

于 2013-02-19T17:17:33.867 に答える
1

メソッドの受信者が検証対象のオブジェクトである場合、これらは同等です。これは、ActiveModelバリデーターの動作とは異なりますが、概念は似ています。

to_procシンボルを呼び出す:symと、->(x){x.sym}と同等の機能が得られます。シンボルはメッセージとしてprocの引数に送信されます。procを呼び出すto_procと、それ自体が返されるだけなので、シンボルまたはprocのいずれかをメソッドに渡して、procを保証できます。

def return_a_proc(symbol_or_proc)
  symbol_or_proc.to_proc
end

モデルインスタンスがレシーバーではない場合、たとえば、検証メソッドがモデルを引数として受け取る場合、またはDaniel Evansの例のように、procを明示的に構築して、procの引数で何を実行するかを指定する必要があります。

于 2013-02-19T17:28:02.027 に答える