Techioz Blog

OpsCode Chef でラムダを呼び出して、実行時評価のみを実行できるようにするにはどうすればよいですか?

概要

Chef とコンパイル時ではなく実行時に変数を評価する Lambda メソッドに関して質問があります。以下の抜粋を確認してください。

md5 = lambda { Digest::MD5.file("#{some_file}").hexdigest }
pp "md5: #{md5}"

その結果、次のような結果が得られます。

md5: #<Proc:0x000000000c153b08

しかし、変数自体が必要です。ラムダを呼び出して実際の変数を取得するための正確な構文は何ですか?何日も髪を抜いています。

ご協力をよろしくお願いいたします。

解決策

proc または lambda を呼び出すためのいくつかのオプション:

md5 = lambda { "foo" }

"md5: #{md5.call}"  #=> "md5: foo"
"md5: #{md5.()}"    #=> "md5: foo"
"md5: #{md5[]}"     #=> "md5: foo"
"md5: #{md5.yield}" #=> "md5: foo"

上記のそれぞれは引数も受け入れることができます。これは、たとえばファイル名を渡すために使用できます: (-> は lambda proc リテラルです)

md5 = ->(filename) { Digest::MD5.file(filename).hexdigest }

"md5: #{md5.call(somefile)}"
"md5: #{md5.(somefile)}"
"md5: #{md5[somefile]}"
"md5: #{md5.yield(somefile)}"