RailsCasts6 Shortcut Blocks with Symbol to_ProcはSymbolをto_に変換procはblockを簡略化する

3112 ワード

次のコードfindの方法では、奇妙に見える文法で、1つの&記号の後ろに名前が付いています.to_と呼ばれています.proc.RailsによるRubyの機能拡張です.
ruby
class Project < ActiveRecord::Base
  has_many :tasks

  def self.all_names
    find(:all).collect(&:name)
  end
end

Rails Consoleの次の例で説明する.Rails script/consoleコマンドRailsコンソールを起動します.まず、Projectをすべて取得します.
terminal
Laa-Laa:todo eifion$ script/console
Loading development environment (Rails 2.2.2)
>> projects = Project.find(:all)
=> [#<Project id: 1, name: "Write another ASCIIcast", created_at: "2008-12-29 09:32:47", updated_at: "2008-12-29 09:32:47">, #<Project id: 2, name: "Go out walking", created_at: "2008-12-29 09:33:04", updated_at: "2008-12-29 09:33:04">]

結果に含まれる2つのプロジェクトオブジェクトはリスト形式で返されますが、この2つのオブジェクトの名前を取得するにはどうすればいいですか?第1の方法は、collectの方法を用いて、コールバック用のコードブロックにプロジェクト名を返す論理を記入することである.collectメソッドの役割は、リストを巡回し、各項目のオブジェクトにコードブロックで定義された論理操作を実行させ、戻り値を得ることであり、元のリストに基づく戻り値リストを返す.
terminal
>> projects.collect { |p| p.name }
=> ["Write another ASCIIcast", "Go out walking"]

to_Procでは、コードブロックに渡す必要がある論理に名前を付けることができます.これにより、コードブロックに書かれた論理は、& のパラメータを入力するだけで他の場所で定義できます.次のようになります.
terminal
>> projects.collect (&:name)
=> ["Write another ASCIIcast", "Go out walking"]

チェーン呼び出しが必要な場合、このフォーマットの役割はさらに顕著になります.次のコードは、より読みやすさが向上していますか?
terminal
>> projects.collect(&:name).collect(&:upcase)
=&gt; ["WRITE ANOTHER ASCIICAST", "GO OUT WALKING"]

もちろん、collectメソッドに限らず、すべてのコードブロックでto_を使用することができます.proc.例えば、anyメソッドに対して、検査項目が正常に展開されているかどうかを定義することができるto_Procは、allメソッドに対して保存されたto_を定義することができる.procなど.
terminal
>> projects.all?(&:valid?)
=> true
>> projects.any?(&:valid?)
=> true
>> projects.each(&:save!)
=> [#<Project id: 1, name: "Write another ASCIIcast", created_at: "2008-12-29 09:32:47", updated_at: "2008-12-29 09:32:47">, #<Project id: 2, name: "Go out walking", created_at: "2008-12-29 09:33:04", updated_at: "2008-12-29 09:33:04">]

最初は文法が変に見えるかもしれませんが、チェーン呼び出しが必要な場合は、絶対にあなたの手伝いです.
変換元:http://railscasts.com/episodes/6-shortcut-blocks-with-symbol-to-proc?language=zh&view=asciicast