第5回セントラルソフトRuby研究会

1,030 views

Published on

若手によるRuby社内勉強会の資料です。

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,030
On SlideShare
0
From Embeds
0
Number of Embeds
12
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

第5回セントラルソフトRuby研究会

  1. 1. ブロック入門 クロージャ入門 と 脱javaコード
  2. 2. Ruby力アップ Ruby技術者認定試験対策
  3. 3.  ブロックについて  概要 Yieldメソッドを用いてブロックの解説  Yieldとは  ブロックに引数をつけてみる ブロックって何クラス?  Procクラスだったよ Procクラスとは  概要  Procクラス飼い慣らすとクロージャができる ついでなのでRubyでクロージャやります  クロージャとは  サンプルコード
  4. 4. クラス変数、メンバ変数、グローバル変数を使わずに、以下の処理結果を実現する方法を答えてください。hoge( ) # 1hoge( ) # 2hoge( ) # 3hoge( ) # 4答えは後半で。
  5. 5.  “{”と”}” か“do” と“end”で挟まれた区間 ブロックだけでは存在できない ただのコードの塊 オブジェクトじゃない Rubyの肝(らしい)
  6. 6. 3.times{ p “hello” } [‘a’,‘b’.‘c’].eac h do|v| puts v end3.times do p "hello" わかりにくいend
  7. 7.  説明しやすい(体感) yieldはruby技術者認定試験範囲
  8. 8.  引数として受け取ったブロックを実行するメソッド コレだけ! 身を任せる(出典:Yahoo!辞書) 「いーるど」と読む
  9. 9. def handsUp yieldendhandsUp{ puts “help me!” }=> “help me!”
  10. 10. def handsUp(ブロック)←隠れ引数 yield ←ブロックをそのまま実行endhandsUp { puts “help me!” } yieldを二行続けて 書くとどうなる?
  11. 11.  引数がついたdef hoge yield(2)endp hoge{ | x | x * 2 }=>4
  12. 12. def hoge yield(2) end p hoge{ | x | x * 2 }def yield (vaule) x = vaule return x * 2end =>4
  13. 13.  引数を増やしたdef hoge yield(2 , 2)endp hoge{ | x , y | x * y * 2 }
  14. 14.  基本は同じdef hoge( num1 , num2 ) yield( num1 , num2 )endp hoge( 2 , 2 ){ | x , y | x * y * 2 }
  15. 15.  文字列を渡してみるdef hoge( str ) yield( 2 , 2 , str )endp hoge("です"){ | x , y , z | "#{x * y * 2} #{z}" } ブロックとメソッドの引数の 違いがわかったところ、次のステップへ・・・
  16. 16. ブロックに慣れてきたところでそもそもブロックって何クラス? BlockClass?
  17. 17.  ブロックはコードの塊 オブジェクトじゃない実は…メソッドは受け取ったブロックを暗黙的にオブジェクトに変換していた 何クラス?!
  18. 18. ブロックを明示的に受け取る! 検証しますdef hoge ( &block ) block.class()endp hoge{ }=> “Proc”
  19. 19.  ブロックをオブジェクトにしたもの Procインスタンスを手続き型オブジェクトという Procを飼い慣らすとクロージャが使える(※) つまり持ち運べるようになった ブロック クロージャ? クロージャ? クロージャ? クロージャについて詳しく
  20. 20.  クイズの答え 死んでいるはずの変数が生き埋めになっている関数 関数型言語で(Javascriptとか)で盛んなイメージ 意味は閉包 メソッドの中でProcインスタンスを作ると発生何ができる? 関数内で値を保持できる 書けるとかっこいい 色々…
  21. 21. ブロックを使うのだけど… Procインスタンスを明示的に宣言をする必要がある ブロックを変数に保管しなければならない yieldのことは忘れる 宣言と保管方法について
  22. 22. hoge = Proc.new{ p “foo"}hoge.call()=> “foo” 準備完了!!明示的宣言できた!変数に保管できた! クロージャのサンプルを見る
  23. 23. def hoge Proc.newが実行された時, x=1 周辺にある変数を束縛す return Proc.new{ x } る。End 引数以外の変数を、x=3 実行時の環境ではなくfoo = hoge() 自身が定義された環境(スコープ) でp foo.call() 解決しているp foo.call()
  24. 24. def hoge x=1 return Proc.new{ x = x + 1}end Proc.newが実行された時, 周辺にある変数を束縛する。foo = hoge()p foo.call() #2p foo.call() #3p foo.call() #4
  25. 25. def hoge array = [] return Proc.new do | name | array.push( name ) end Proc.newが実行された時,end 周辺にある変数を束縛する。foo = hoge()p foo.call(“Tokyo")p foo.call(“China")p foo.call(“U.S.A")
  26. 26. ブロックの有無を確認するメソッド block_given?ブロックをオブジェクトに変換するコード Proc.new{ } proc{ } lambda{ }

×