O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

20150928楽しいlambda

1.229 visualizações

Publicada em

2015/9/28にLOUPEさんと開催した勉強会用スライドです。
Lambdaの使いどころを掻い摘まんで説明しました。

Publicada em: Tecnologia
  • Entre para ver os comentários

20150928楽しいlambda

  1. 1. 楽しいLambda 1 2015年年9⽉月28⽇日   ! 株式会社フランジア・ジャパン   CTO  本間紀史
  2. 2. 提 供 2 フランジア・ジャパン
  3. 3. 3 簡単な処理理をメソッドとの対⽐比で はじめてのLambda 3
  4. 4. 4 まずはメソッドで実装 はじめてのLambda 4
  5. 5. 5 はじめてのLambda 5 実装するのはこちら 画像引⽤用元:  http://manapedia.jp/text/2397
  6. 6. 6 まずは階乗から。おそらく⼀一番分かり易易い実装 def fact n (1..n).reduce :* end ! fact 3 => 6 fact(7) => 5040 組合せの計算式をRubyで実装してみる 6 メソッドで実装しました。   1〜~与えられた引数までを順に掛け合わせて結果を返却します。
  7. 7. 7 階乗のメソッドを利利⽤用して組合せのメソッドを作成 def combination n, r fact(n)/(fact(n-r)*fact(r)) end ! combination 5, 3 => 10 combination 10, 4 => 210 組合せの計算式をRubyで実装してみる 7 悪く無いですね。ごく普通の実装。
  8. 8. 8 nを固定して、rを変更更したい n = 10 (1...n).each{|r|puts combination n,r} 10 45 120 210 252 210 120 45 10 組合せの計算式をRubyで実装してみる 8 毎回固定したnを指定し続ける必要があります。   →インスタンス変数で管理理する?(実は良良い⽅方法がありますが、最後の⽅方で)
  9. 9. 9 次にLambda はじめてのLambda 9
  10. 10. 10 Lambdaを使って階乗を実装する fact = ->n{(1..n).reduce :*} => #<Proc:0x007fb528c46708@(pry):1 (lambda)> fact.call 3 => 6 fact.call 7 => 5040 組合せの計算式をRubyで実装してみる 10 Lambdaで実装しました。処理理の実装は変わりません。
  11. 11. 11 Lambdaを使って階乗を実装する #こんな書き方も fact[5] => 120 fact.(3) => 6 fact === 6 => 720 組合せの計算式をRubyで実装してみる 11 いずれもcallメソッドと同じ動きをします。   3番⽬目はcase式と⼀一緒に⽤用いますね。   1番⽬目の⽂文法が読み易易いと感じるので、今回はこれに統⼀一します。
  12. 12. 12 階乗のLambdaを利利⽤用して組合せのLambdaを作成 combination = ->n, r{fact[n]/(fact[n-r]*fact[r])} => #<Proc:0x007fb528c8f480@(pry):11 (lambda)> combination[5, 3] => 10 combination[10, 4] => 210 組合せの計算式をRubyで実装してみる 12 メソッドでの実装とほぼ変わらない実装です。
  13. 13. 13 ⾼高階Lambda はじめてのLambda 13
  14. 14. 14 Lambdaを返すLambdaを実装する combination = ->n{->r{fact[n]/(fact[n-r]*fact[r])}} => #<Proc:0x007fb529faa588@(pry):17 (lambda)> combination[5][3] => 10 combination[10][4] => 210 組合せの計算式をRubyで実装してみる 14 呼び⽅方が変わっただけ・・・?
  15. 15. 15 Lambdaを返すLambdaを実装する c5 = combination[5] => #<Proc:0x007fb52a3e2038@(pry):17 (lambda)> c5[3] => 10 c10 = combination[10] => #<Proc:0x007fb52a4018c0@(pry):17 (lambda)> c10[4] => 210 組合せの計算式をRubyで実装してみる 15 nだけを束縛したLambdaを⽣生成できるようになりました。
  16. 16. 16 束縛 はじめてのLambda 16
  17. 17. 17 【再び】nを固定して、rを変更更したい n = 10 (1...n).each{|r|puts combination n,r} 10 45 120 210 252 210 120 45 10 組合せの計算式をRubyで実装してみる 17 これをLambda版で実装すると・・・
  18. 18. 18 nを固定して、rを変更更したい c10 = combination[10] => #<Proc:0x007fb52a4018c0@(pry):17 (lambda)> (1...10).each{|r|puts c10[r]} 10 45 120 210 252 210 120 45 10 組合せの計算式をRubyで実装してみる 18 nだけを束縛したLambdaを⽣生成できるようになりました。
  19. 19. 19 nの値はLambdaの中に束縛されている eval "n", c10.binding => 10 c10.binding.eval "n" => 10 Lambdaの束縛 19 bindingメソッドを利利⽤用するとその中の束縛にアクセスすることができます
  20. 20. 20 Lambdaの束縛をキャッシュとして利利⽤用する counter = ->c{->n{c += n}} => #<Proc:0x007fb529f02838@(pry):51 (lambda)> c1 = counter[1] => #<Proc:0x007fb529ea5070@(pry):51 (lambda)> c1[0] => 1 c1[1] => 2 c1[5] => 7 束縛を利利⽤用したキャッシュ 20 c1に束縛されているcはc1が存在する限り値を保持したまま存在します
  21. 21. 21 メソッドとLambda(みたいなの) Lambdaと仲間達 21
  22. 22. 22 class#method  メソッド i = 3 => 3 i.method :+ => #<Method: Fixnum#+> i.method(:+)[5] => 8 s = "a" => "a" s.method(:succ!)[] => "b" s => "b" Methodオブジェクトに変換してLambdaのように使う 22 破壊的メソッドを呼んだらレシーバーが更更新されます
  23. 23. 23 mapの引数等に i = 3 => 3 (1..3).map{|n| i + n} => [4, 5, 6] (1..3).map &(i.method :+) => [4, 5, 6] どんな時に使う? 23 あるオブジェクトの処理理だけを取得して、別のスコープで実⾏行行します
  24. 24. 24 【再び】nを固定して、rを変更更したい c = method(:combination).curry => #<Proc:0x007fa3bd5c9938 (lambda)> c10 = c[10] => #<Proc:0x007fa3bd8db6f8 (lambda)> (1...10).each{|r|puts c10[r]} 10 45 120 210 252 210 120 45 10 curry化 24 メソッドを⼀一旦Lambdaに変換して、curry化することが可能です
  25. 25. 25 動的コードとLambda もう少しLambda 25
  26. 26. 26 ゲームのアイテムを追加したときとか item = {name: "portion", effect: "u.hp += 10"} ! class User attr_accessor :hp def use_item item eval("->u{#{item[:effect]}}")[self] end end ! user = User.new => #<User:0x007fb52a39b6b0> user.hp = 30 => 30 user.use_item item => 40 動的にコードを評価したい時のLambda 26 マスターデータにRubyのコードを格納できるので仕様変更更(追加)に強いです   本当はもうちょっと書き⽅方違う⽅方が良良いけど・・・
  27. 27. 27 まとめ はじめてのLambda 27
  28. 28. 28 結論論的な・・・ 28 Lambdaは束縛をうまく利利⽤用することで、ある状態をキープできます。     それを利利⽤用して、     ・多変量量の関数の⼀一変数を固定する     ・Lambda内部にキャッシュ機構を持たせる     ことができます。   ! Lambdaをコードスニペットのように扱い、ロジックを外部に持たせることがで きます。     →例例)ゲームにアイテムを追加する時にその効⽤用もDBに保存する   ! メソッドの戻り値としてLambdaを返すことで、メソッドを呼ぶ側に実⾏行行タイミ ングを任せた上で、処理理内容のみを渡すことができます     →ここは良良い例例が思いつかなかったので⼝口頭で・・・ とりあえず、Lambda楽しい!

×