その他
    ホーム 技術発信 DoRuby lambda のスコープ

    lambda のスコープ

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    lambda というのを使ってみたのでメモです。

    使い方は Proc.new と同じです。

    ※ ブロック内で return したときの挙動が違います。

    メソッドを変数のように扱うことができます。

    定義時のスコープの変数を参照するところが面白いと思いました。

     使い方

    lambda ブロック

    ※ ブロックというのは雑にいうと do ;end や {} で囲った処理の定義のこと。

     環境

    ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]

    Pry version 0.10.1 on Ruby 2.2.2

     使ってみました。

    ブロック定義時に未定義の変数は未定義のままとなることの確認(変数を定義すると試せないので先に試します)

    proc = lambda {puts i}
    proc.call
    
    出力
    NameError: undefined local variable or method `i' for main:Object
    from (pry):1:in `block in __pry__'
    
    i = 3
    proc.call
    
    出力
    NameError: undefined local variable or method `i' for main:Object
    from (pry):1:in `block in __pry__'
    

    標準的な使い方

    i = 2
    proc = lambda {puts i}
    proc.call
    
    出力
    2
    
    • ブロック定義前に使用される変数を定義されていることがポイント

    each内での挙動

    i = 5
    proc = lambda {puts i}
    (1..4).each do |i|
      proc.call
    end
    
    出力
    5
    5
    5
    5
    

    each内で意図した出力を試みる

    i = 7
    proc = lambda {puts i}
    (1..4).each do |j|
      i = j
      proc.call
    end
    
    出力
    1
    2
    3
    4
    

    for を使って見る

    i = 11
    proc = lambda {puts i}
    for i in (1..4)
      proc.call
    end
    
    出力
    1
    2
    3
    4
    

    直接引数を渡すときはブロック引数を使う

    proc = lambda { |value|  puts value}
    proc.call('引数はこれ')
    
    出力
    引数はこれ