Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Rubyist生活に欠かせ
ないブロック構文の話
@ran_tan
Twitter: @ran_tan
Facebook: kohei.taniguchi
HAW International.inc
谷口 耕平
学びと成長サポート事業部
@飯塚
問題 10回 Ruby と出力して下さい。
問題 10回 Ruby と出力して下さい。
for i in 1..10!
puts 'Ruby'!
end
普通に書いてみる
問題 10回 Ruby と出力して下さい。
for i in 1..10!
puts 'Ruby'!
end
普通に書いてみる
もう少しRubyっぽく書いてみる
10.times do!
puts 'Ruby'!
end
問題 10回 Ruby と出力して下さい。
for i in 1..10!
puts 'Ruby'!
end
普通に書いてみる
もう少しRubyっぽく書いてみる
10.times do!
puts 'Ruby'!
end
forは繰り返し処理の...
問題 10回 Ruby と出力して下さい。
for i in 1..10!
puts 'Ruby'!
end
普通に書いてみる
もう少しRubyっぽく書いてみる
10.times do!
puts 'Ruby'!
end
forは繰り返し処理の...
問題 10回 Ruby と出力して下さい。
10.times do!
puts 'Ruby'!
end
timesがメソッドならその後ろのdo … endはなにか?
問題 10回 Ruby と出力して下さい。
10.times do!
puts 'Ruby'!
end
timesがメソッドならその後ろのdo … endはなにか?
→ブロック
ブロック構文
ざっくり言うと、
・ブロックとは処理の塊
・メソッドに渡すことが出来る
!
・高階関数を簡単に書ける画期的な構文!
ブロックを受け取るメソッド
array = [24, 21, 4, 41, 39]!
!
# 配列の値が奇数か偶数か判定!
array.each do |i|!
if i % 2 == 1!
puts "#{i} is odd"!
else!
...
ブロックを受け取るメソッド
array = [24, 21, 4, 41, 39]!
!
# 配列の値が奇数か偶数か判定!
array.each do |i|!
if i % 2 == 1!
puts "#{i} is odd"!
else!
...
ブロックを受け取るメソッド
collect, map
array = [24, 21, 4, 41, 39]!
!
# 数字の代わりに奇数ならtrue、偶数ならfalseが入った配列を作れ!
array.collect do |i|!
i % ...
ブロックを受け取るメソッド
collect, map
array = [24, 21, 4, 41, 39]!
!
# 数字の代わりに奇数ならtrue、偶数ならfalseが入った配列を作れ!
array.collect do |i|!
i % ...
ブロックを受け取るメソッド
collect, map
array = [24, 21, 4, 41, 39]!
!
# 数字の代わりに奇数ならtrue、偶数ならfalseが入った配列を作れ!
array.collect do |i|!
i % ...
ブロックを受け取るメソッド
collect, map
array = [24, 21, 4, 41, 39]!
!
# 数字の代わりに奇数ならtrue、偶数ならfalseが入った配列を作れ!
array.collect do |i|!
i % ...
ブロックを受け取るメソッド
collect, map
array = [24, 21, 4, 41, 39]!
!
# 数字の代わりに奇数ならtrue、偶数ならfalseが入った配列を作れ!
array.collect do |i|!
i % ...
ブロックを受け取るメソッド
inject, reduce
array = [24, 21, 4, 41, 39]!
# 合計を計算してみよう!
!
array.inject(0) { |result, i| result + i } # => ...
ブロックを受け取るメソッド
inject, reduce
array = [24, 21, 4, 41, 39]!
# 合計を計算してみよう!
!
array.inject(0) { |result, i| result + i } # => ...
ブロックを受け取るメソッド
inject, reduce
array = [24, 21, 4, 41, 39]!
# 合計を計算してみよう!
!
array.inject(0) { |result, i| result + i } # => ...
ブロックを受け取るメソッド
inject, reduce
array = [24, 21, 4, 41, 39]!
# 合計を計算してみよう!
!
array.inject(0) { |result, i| result + i } # => ...
ブロックを受け取るメソッド
inject, reduce
array = [24, 21, 4, 41, 39]!
# 合計を計算してみよう!
!
array.inject(0) { |result, i| result + i } # => ...
ブロックを受け取るメソッド
inject, reduce
array = [24, 21, 4, 41, 39]!
# 合計を計算してみよう!
!
array.inject(0) { |result, i| result + i } # => ...
ブロックを受け取るメソッド
# 偶数だけを取り出し、1の位でソートしたい!
[4, 21, 16, 42, 31].select(&:even?).sort{ |i, j| i % 10 <=> j % 10} !
# => [42, 4, 1...
ブロックを受け取るメソッド
# ブロックを受け取るメソッドはコレクション操作だけじゃないです。!
# ファイル操作の例!
!
# ブロックを使わないパターン!
file = open('example.rb')!
puts file.gets!...
ブロックを受け取るメソッドを定義する
# 出力をデコレートしてみる!
def decorate_output!
puts '-*-*-*-*-*-*-'!
yield!
puts '-*-*-*-*-*-*-'!
end!
!
decorate...
# こんな動作をするselectメソッドを定義してみます。!
select([24, 21, 4, 41, 39]) {|i| i > 10} !
# => [24, 21, 41, 39]!
!
# yieldに引数を渡すことで、ブロックに引...
# ブロックを引数にして受け取ることも出来ます。!
def select(array, &block)!
result = []!
array.each do |i|!
result << i if block.call(i)!
end!
re...
Upcoming SlideShare
Loading in …5
×
Upcoming SlideShare
Designing Content for Multiple Devices
Next
Download to read offline and view in fullscreen.

3

Share

Download to read offline

Rubyist生活に欠かせないブロック構文の話

Download to read offline

福岡のRUby勉強会での発表資料です。
http://atnd.org/events/52535

Related Books

Free with a 30 day trial from Scribd

See all

Rubyist生活に欠かせないブロック構文の話

  1. 1. Rubyist生活に欠かせ ないブロック構文の話 @ran_tan
  2. 2. Twitter: @ran_tan Facebook: kohei.taniguchi HAW International.inc 谷口 耕平 学びと成長サポート事業部 @飯塚
  3. 3. 問題 10回 Ruby と出力して下さい。
  4. 4. 問題 10回 Ruby と出力して下さい。 for i in 1..10! puts 'Ruby'! end 普通に書いてみる
  5. 5. 問題 10回 Ruby と出力して下さい。 for i in 1..10! puts 'Ruby'! end 普通に書いてみる もう少しRubyっぽく書いてみる 10.times do! puts 'Ruby'! end
  6. 6. 問題 10回 Ruby と出力して下さい。 for i in 1..10! puts 'Ruby'! end 普通に書いてみる もう少しRubyっぽく書いてみる 10.times do! puts 'Ruby'! end forは繰り返し処理のための構文
  7. 7. 問題 10回 Ruby と出力して下さい。 for i in 1..10! puts 'Ruby'! end 普通に書いてみる もう少しRubyっぽく書いてみる 10.times do! puts 'Ruby'! end forは繰り返し処理のための構文 timesはIntegerクラスのメソッド
  8. 8. 問題 10回 Ruby と出力して下さい。 10.times do! puts 'Ruby'! end timesがメソッドならその後ろのdo … endはなにか?
  9. 9. 問題 10回 Ruby と出力して下さい。 10.times do! puts 'Ruby'! end timesがメソッドならその後ろのdo … endはなにか? →ブロック
  10. 10. ブロック構文 ざっくり言うと、 ・ブロックとは処理の塊 ・メソッドに渡すことが出来る ! ・高階関数を簡単に書ける画期的な構文!
  11. 11. ブロックを受け取るメソッド array = [24, 21, 4, 41, 39]! ! # 配列の値が奇数か偶数か判定! array.each do |i|! if i % 2 == 1! puts "#{i} is odd"! else! puts "#{i} is even"! end! end each
  12. 12. ブロックを受け取るメソッド array = [24, 21, 4, 41, 39]! ! # 配列の値が奇数か偶数か判定! array.each do |i|! if i % 2 == 1! puts "#{i} is odd"! else! puts "#{i} is even"! end! end each ブロック引数
  13. 13. ブロックを受け取るメソッド collect, map array = [24, 21, 4, 41, 39]! ! # 数字の代わりに奇数ならtrue、偶数ならfalseが入った配列を作れ! array.collect do |i|! i % 2 == 1! end # => [false, true, false, true, true]! ! ! ! ! ! ! ! ! ! ! ! !
  14. 14. ブロックを受け取るメソッド collect, map array = [24, 21, 4, 41, 39]! ! # 数字の代わりに奇数ならtrue、偶数ならfalseが入った配列を作れ! array.collect do |i|! i % 2 == 1! end # => [false, true, false, true, true]! ! # もう少しわかりやすくしてみる! array.collect do |i|! i.odd?! end # => [false, true, false, true, true]! ! ! ! ! ! !
  15. 15. ブロックを受け取るメソッド collect, map array = [24, 21, 4, 41, 39]! ! # 数字の代わりに奇数ならtrue、偶数ならfalseが入った配列を作れ! array.collect do |i|! i % 2 == 1! end # => [false, true, false, true, true]! ! # もう少しわかりやすくしてみる! array.collect do |i|! i.odd?! end # => [false, true, false, true, true]! ! # 1行で書いてみる! array.collect { |i| i.odd? }! ! ! ! do … endの代わりに{ }でもいい
  16. 16. ブロックを受け取るメソッド collect, map array = [24, 21, 4, 41, 39]! ! # 数字の代わりに奇数ならtrue、偶数ならfalseが入った配列を作れ! array.collect do |i|! i % 2 == 1! end # => [false, true, false, true, true]! ! # もう少しわかりやすくしてみる! array.collect do |i|! i.odd?! end # => [false, true, false, true, true]! ! # 1行で書いてみる! array.collect { |i| i.odd? }! ! # まだ長い?! array.collect(&:odd?)!
  17. 17. ブロックを受け取るメソッド collect, map array = [24, 21, 4, 41, 39]! ! # 数字の代わりに奇数ならtrue、偶数ならfalseが入った配列を作れ! array.collect do |i|! i % 2 == 1! end # => [false, true, false, true, true]! ! # もう少しわかりやすくしてみる! array.collect do |i|! i.odd?! end # => [false, true, false, true, true]! ! # 1行で書いてみる! array.collect { |i| i.odd? }! ! # まだ長い?! array.collect(&:odd?)! メソッドに& + シンボルを渡すと、 ブロック引数に対して シンボルで渡した名前のメソッドが呼ばれる。
  18. 18. ブロックを受け取るメソッド inject, reduce array = [24, 21, 4, 41, 39]! # 合計を計算してみよう! ! array.inject(0) { |result, i| result + i } # => 129
  19. 19. ブロックを受け取るメソッド inject, reduce array = [24, 21, 4, 41, 39]! # 合計を計算してみよう! ! array.inject(0) { |result, i| result + i } # => 129 24 21 4 41 39 0i result
  20. 20. ブロックを受け取るメソッド inject, reduce array = [24, 21, 4, 41, 39]! # 合計を計算してみよう! ! array.inject(0) { |result, i| result + i } # => 129 24 21 4 41 39 24i result
  21. 21. ブロックを受け取るメソッド inject, reduce array = [24, 21, 4, 41, 39]! # 合計を計算してみよう! ! array.inject(0) { |result, i| result + i } # => 129 24 21 4 41 39 45i result
  22. 22. ブロックを受け取るメソッド inject, reduce array = [24, 21, 4, 41, 39]! # 合計を計算してみよう! ! array.inject(0) { |result, i| result + i } # => 129 24 21 4 41 39 49 i result
  23. 23. ブロックを受け取るメソッド inject, reduce array = [24, 21, 4, 41, 39]! # 合計を計算してみよう! ! array.inject(0) { |result, i| result + i } # => 129 24 21 4 41 39 90i result
  24. 24. ブロックを受け取るメソッド # 偶数だけを取り出し、1の位でソートしたい! [4, 21, 16, 42, 31].select(&:even?).sort{ |i, j| i % 10 <=> j % 10} ! # => [42, 4, 16] # 偶数だけ取り出したい! array.select { |i| i.even? } # => => [24, 4]! ! # こちらもブロックを省略できます! array.select(&:even?) # => => [24, 4] array = [24, 21, 4, 41, 39] # sortメソッド! array.sort # => [4, 21, 24, 39, 41]! ! # 1の位でソートしたい! array.sort{ |i, j| i % 10 <=> j % 10} # => [41, 21, 24, 4, 39] select sort + =
  25. 25. ブロックを受け取るメソッド # ブロックを受け取るメソッドはコレクション操作だけじゃないです。! # ファイル操作の例! ! # ブロックを使わないパターン! file = open('example.rb')! puts file.gets! file.close! ! # ブロックを使うパターン! open('example.rb') do |file|! puts file.gets! end
  26. 26. ブロックを受け取るメソッドを定義する # 出力をデコレートしてみる! def decorate_output! puts '-*-*-*-*-*-*-'! yield! puts '-*-*-*-*-*-*-'! end! ! decorate_output do ! puts 'Hello, Block!'! end! ! # => -*-*-*-*-*-*-! # Hello, Block!! # -*-*-*-*-*-*- yieldを使います。 受け取ったブロックを実行した い箇所にyieldと書きます。
  27. 27. # こんな動作をするselectメソッドを定義してみます。! select([24, 21, 4, 41, 39]) {|i| i > 10} ! # => [24, 21, 41, 39]! ! # yieldに引数を渡すことで、ブロックに引数を渡せます。! def select(array)! result = []! array.each do |i|! result << i if yield(i)! end! result! end ブロックを受け取るメソッドを定義する
  28. 28. # ブロックを引数にして受け取ることも出来ます。! def select(array, &block)! result = []! array.each do |i|! result << i if block.call(i)! end! result! end! ! # 引数として受け取ったブロックは他のブロック! # を受け取るメソッドに渡すことが出来ます。! def select(array, &block)! array.select(&block)! end! ! ブロックを受け取るメソッドを定義する
  • kenkuratomi

    Apr. 16, 2015
  • furuyagou

    Oct. 27, 2014
  • yu1onda

    Oct. 17, 2014

福岡のRUby勉強会での発表資料です。 http://atnd.org/events/52535

Views

Total views

994

On Slideshare

0

From embeds

0

Number of embeds

28

Actions

Downloads

4

Shares

0

Comments

0

Likes

3

×