じゃ、ま、いっか

その隙間にジャストフィット

いろいろ雑記

第3回Okinawa.rb Meetup@Nahaに参加してきました。

今回も楽しかったです。
会場の雰囲気は@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]