今回も楽しかったです。
会場の雰囲気は@taka16_Oさんの
第3回Okinawa.rb Meetup@Nahaに参加してきました。
を見ていただければ。
@mwduncanさんが遊びに来ていたので、英語でアタックをしかけましたが
全然言葉が出てきやがらねーでやんのwww orz
今週末に eXtremeHago3(みーち) あるから遊びに来てね!って言いたかったのだけれども
あーうーあーうしてて最終的に出てきた言葉が シーユーハゴーっていうどうしようもなさ
英語力鍛えたい。
それでもなんとか伝わったみたいで、ATND に参加登録してくれました!! やったね!
というわけで今回のxhagoは、学生から社会人、さらに米軍基地の中の人も参加するという、まさに沖縄!って感じになってきましたよ。
以上ステマ終わり!
勉強会ではProc, blockの違いについて話題になりました。
散文的にまとめると・・・
- rubyにはblockとProcとyiledとlambdaっていうのがある。
- 何が違うの? なにに使うの?
- openとかcloseとか同じ処理をしたいときに便利だよ。@libkinjoさんのテストコードを引用
#https://gist.github.com/1941474 def write_data_easy(&block) open_database block.call close_database end puts "=== 普通のデータ書き込みはこう書くとする" open_database puts "wrote data" close_database puts "=== &block を使うとこう書ける" write_data_easy do puts "wrote data" end
- Procは上の例でいう&blockを変数に入れて持ち運びできる。
- 持ち運べるので複数のメソッドに同じブロックを渡せて便利
p = Proc.New {puts "wrote data"} write_data_easy &p yet_another_write_data &p
- え、yieldとはなにがちがうの?
def yet_another_write_data open_database yield close_database end
- ほとんど一緒、引数の記述とcallしなくていいからProcよりもスマートに書ける??
- Procのほかにlambdaというのもある。
- Procとなにがちがうの??
- またまた@libkinjoさんのテストコードを引用
#https://gist.github.com/1941474 def foo(v) f = lambda { |a, b| puts "#{a}, #{b}, #{v}" } end puts "lambda で作った Proc オブジェクトを呼んでみる" f = foo(999) f.call(1, 2) puts "引数を少なく呼べるか? => 例外になる" begin f.call(1) rescue => e puts e end # Proc.new で Proc オブジェクトを作る def bar(v) f = Proc.new { |a, b| puts "#{a}, #{b}, #{v}" } end puts "Proc.new で作った Proc オブジェクトを呼んでみる" g = bar(999) g.call(1, 2) puts "引数を少なく呼べるか => 呼べる" g.call(1) # lambda 中で return する def foo2(v) f = lambda { |a, b| return true puts "#{a}, #{b}, #{v}" } end puts "lambda で作った Proc オブジェクトから return できるか? => できる" f = foo2(999) if f.call(1, 2) == true puts "returned" end # Proc.new の中で return する def bar2(v) f = Proc.new { |a, b| return true puts "#{a}, #{b}, #{v}" } end puts "&proc の中から return できる? => 例外" begin baz { |a| return true } rescue => e puts e end
まとめると
- Procは引数のチェックをしない。
- Procは返り値をもどせない。
- lambdaは引数のチェックをする。
- lambdaは返り値を戻せる。
こんな感じ。
勉強会内ではProcはサブルーチンで、lambdaは関数という結論に落ち着いたけれどもあってるかな? 不安
yieldで書くことが多いのでProcやlambdaは始めて触って勉強になりました。
lambda使ってみたいよlambda
ちなみにyieldはこんな風に使ったことがあります。
Rubyで標準出力をナニしたい時に書いたコード
標準出力を書き換える処理をメソッドでまとめて、処理をブロックで受け取るような感じ
class Display attr_accessor :print def initialize @print = [] end def write(msg) @print.push(msg) end end def display_capture disp = Display.new $stdout = disp yield $stdout = STDOUT return disp.print end def test_hoge res = display_capture do print 1 print 2 end assert_equal([1, 2], res) end
来週のOkinawa.rbも楽しみ
その前にxHago3もよろしくね!
[2012-03-02 06:52]