{ 2013.7.29 }

LambdaとTryと私

    はてなブックマーク - LambdaとTryと私
    このエントリーをはてなブックマークに追加

    こんにちは、Fusicの中野です。
    Ruby on Rails(ActiveSupport) にObject#tryという便利なメソッドがあります。

    1
    2
    3
    4
    5
    
    a = { b: 1}
    a.try(:[], :b) # => 1
     
    a = nil
    a.try(:[], :b) # => nil

    で、便利なのでついついこんな感じで書いてしまいます。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    class Tables < ActiveRecord::Migration
      def up 
        create_table :as do |t|
          t.text :title
          t.timestamps
        end
        create_table :bs do |t|
          t.text :title
          t.integer :a_id
          t.timestamps
        end
        create_table :cs do |t|
          t.text :title
          t.integer :b_id
          t.timestamps
        end
        a = A.new(title: "title")
        a.bs << B.new(title: "title1-1"); a.bs << B.new(title: "title1-2")
        a.bs[0].cs << C.new(title: "title1-1-1"); a.bs[0].cs << C.new(title: "title1-1-2"); a.bs[0].cs << C.new(title: "title1-1-3")
        a.bs[1].cs << C.new(title: "title1-2-1")
        a.save
      end
      def down; drop_table :as; drop_table :bs; drop_table :cs; end
    end
     
    # ↑のようなデータがあったとして
     
    c = C.find_by_id(1)
    c.try(:b).try(:a).try(:title).try { |_| "#{_} == title" } # => "title == title"

    なんかかっこ悪いので、こちらの素敵なライブラリを使ってみましょう。

    1
    2
    3
    4
    5
    6
    7
    
    require &#039;lambda_driver&#039;
     
    c = C.find_by_id(1)
    (-:try < c).(&:b >> :a >> :title >> lambda { |_| "#{_} == title" }) # => "title == title"
     
    c = C.find_by_id(10)
    (-:try < c).(&:b >> :a >> :title >> lambda { |_| "#{_} == title" }) # => nil

    すごく、ナウいですね。

    最後に

    最近、このブログがPHPばかりだったので、なんとなくRubyの記事を載せてみました。
    決して社内研修の次の日なので、疲れているとかではありません。

    Comments are closed.