2014年7月26日
Ruby初級者向けレッスン 50回
— ブロック —
ひがき @ Ruby関西
お品書き
• ブロックとは?
– 繰り返し
– Enumerable
• メソッドにブロックを渡す
• ブロックで値を受け取る
• メソッドでブロックを受け取る
• ブロックに値を渡す
繰り返し
a = [0, 1, 2]
a.each do |i|
puts i
end
# >> 0
# >> 1
# >> 2
繰り返し
a = [0, 1, 2]
a.each{|i| puts i}
# >> 0
# >> 1
# >> 2
Enumerable
• 繰り返しを行なうクラスのためのモジュール
• クラスには each メソッドが必要
Array.ancestors
# => [Array, Enumerable, Object, Kerne
Hash.ancesto...
BasicObject
Object
Mix-in
Kernel
Mix-in
Enumerable
map
select
inject
Array
Hash
each
each
便利な例
a = [0, 1, 2, 3] # => [0, 1, 2, 3]
a.map{|i| i * i} # => [0, 1, 4, 9]
a.select{|i| i.even?} # => [0, 2]
a.inject{|s, ...
array.map{|i| i * i}
アプリケーション ブロック オブジェクト
-生成
§
¦
¤
¥{|i| i * i}
-map
 呼出
ブロックを渡す
• メソッドには、ブロックをひとつ渡せる。
• ブロックをどう使うかは、メソッド次第。
open(’hello.txt’) # = #File:hello.txt
open(’hello.txt’){|f| f.read}
# ...
ファイル入出力の例
begin
f = open(’hello.txt’)
f.read
ensure
f.close unless f.nil?
end
ブロックのない open
アプリケーション オブジェクト
-open
-read
-close
×
ブロック付き open
open(’hello.txt’){|f| f.read}
アプリケーション ブロック オブジェクト
§
¦
¤
¥{|f| f.read}
-生成
-open
 呼出

close
×
値を受け取る
• ブロックは、値を受け取れる。
• 何を幾つ受け取れるかは、メソッド次第。
値は受け取らなくてもいい
2.times{|i| puts i}
#  0
#  1
2.times{puts ’こんにちは’}
#  こんにちは
#  こんにちは
Hash の例
people = {matz: 49, dhh: 34}
# = {:matz=49, :dhh=34}
people.each{|person| p person}
#  [:matz, 49]
#  [:dhh, 34]
Hash の例 (2)
people = {matz: 49, dhh: 34}
people.each do |name, age|
puts #{name}(#{age})
end
#  matz(49)
#  dhh(34)
each cons の例
midosuji = [梅田, 淀屋橋,
本町, 心斎橋, なんば]
midosuji.each_cons(2){|path| p path}
#  [梅田, 淀屋橋]
#  [淀屋橋, 本町]
#  [本町, 心斎橋...
each cons の例 (2)
midosuji.each_cons(2) do |from, to|
p #{from} - #{to}
end
#  梅田 - 淀屋橋
#  淀屋橋 - 本町
#  本町 - 心斎橋
#  心斎橋 - なんば
each cons の例 (3)
a = [*0..3] # = [0, 1, 2, 3]
a.each_cons(3){|i| p i}
#  [0, 1, 2]
#  [1, 2, 3]
a.each_cons(3){|i, j| p [i...
ブロックを受け取るメソッド
• こんな感じで呼びたい
monta{puts ’block!’}
#  block!
#  block!
#  大切なことなので
ブロックを受け取る
def monta
yield
yield
puts ’大切なことなので’
end
ブロックを受け取る (2)
def monta(block)
block.call
block.call
puts ’大切なことなので’
end
値を渡す
def monta
yield ’大切なことなので’
yield ’大切なことなので’
end
monta{|i| puts i}
#  大切なことなので
#  大切なことなので
値を渡す (2)
def monta(block)
block.call ’大切な’, ’ことなので’
block.call [’大切な’, ’ことなので’]
end
monta{|i| p i}
#  大切な
#  [大切な, ことなので]
値を渡す (3)
def monta(block)
block.call ’大切な’, ’ことなので’
block.call [’大切な’, ’ことなので’]
end
monta{|i, j| p #{i}, #{j}}
#  大切な, ことな...
ブロックは Proc
block = Proc.new do |i, j|
puts #{i}#{j}
end
monta(block)
#  大切なことなので
#  大切なことなので
演習問題 0
今日のレッスンで分からなかったこと、疑問に
思ったことをグループで話し合ってみよう。
演習問題 1
0 から 9 までの数値をもつ配列 a がある。
• 各要素を順番に表示しよう。
• 各要素を 2倍した値を持つ配列を作ろう。
• 全要素の合計値を計算しよう。
a = (0..9).to_a
a # = [0, 1, 2, 3,...
演習問題 2
0 から 9 までの数値をもつ配列 a がある。
奇数の要素だけを持つ配列を作ろう。
ただし odd? メソッドは使用禁止。
演習問題 3
Enumerable#map を自作してみよう。
module Enumerable
def my_map
……
end
end
ただし Enumerable#map と Enumerable#map!
は使用禁止。
自己紹介
• 名前 (ニックネーム)
• 普段の仕事・研究内容・代表作
• Ruby歴・コンピュータ歴
• 勉強会に来た目的
• などなど
参考
• 公式サイト
https://www.ruby-lang.org/
• るりま
http://docs.ruby-lang.org/ja/
• 解答例
https://github.com/higaki/
learn_ruby_kans...
Upcoming SlideShare
Loading in …5
×

Ruby初級者向けレッスン 50回 ─── ブロック

980 views

Published on

P.26 「ブロックは Proc」は間違いでした。

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
980
On SlideShare
0
From Embeds
0
Number of Embeds
19
Actions
Shares
0
Downloads
7
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Ruby初級者向けレッスン 50回 ─── ブロック

  1. 1. 2014年7月26日 Ruby初級者向けレッスン 50回 — ブロック — ひがき @ Ruby関西
  2. 2. お品書き • ブロックとは? – 繰り返し – Enumerable • メソッドにブロックを渡す • ブロックで値を受け取る • メソッドでブロックを受け取る • ブロックに値を渡す
  3. 3. 繰り返し a = [0, 1, 2] a.each do |i| puts i end # >> 0 # >> 1 # >> 2
  4. 4. 繰り返し a = [0, 1, 2] a.each{|i| puts i} # >> 0 # >> 1 # >> 2
  5. 5. Enumerable • 繰り返しを行なうクラスのためのモジュール • クラスには each メソッドが必要 Array.ancestors # => [Array, Enumerable, Object, Kerne Hash.ancestors # => [Hash, Enumerable, Object, Kernel
  6. 6. BasicObject Object Mix-in Kernel Mix-in Enumerable map select inject Array Hash each each
  7. 7. 便利な例 a = [0, 1, 2, 3] # => [0, 1, 2, 3] a.map{|i| i * i} # => [0, 1, 4, 9] a.select{|i| i.even?} # => [0, 2] a.inject{|s, i| s + i} # => 6 a.find{|i| i.odd?} # => 1 a.all?{|i| i.even?} # => false a.any?{|i| i.even?} # => true
  8. 8. array.map{|i| i * i} アプリケーション ブロック オブジェクト -生成 § ¦ ¤ ¥{|i| i * i} -map 呼出
  9. 9. ブロックを渡す • メソッドには、ブロックをひとつ渡せる。 • ブロックをどう使うかは、メソッド次第。 open(’hello.txt’) # = #File:hello.txt open(’hello.txt’){|f| f.read} # = こんにちはn
  10. 10. ファイル入出力の例 begin f = open(’hello.txt’) f.read ensure f.close unless f.nil? end
  11. 11. ブロックのない open アプリケーション オブジェクト -open -read -close ×
  12. 12. ブロック付き open open(’hello.txt’){|f| f.read} アプリケーション ブロック オブジェクト § ¦ ¤ ¥{|f| f.read} -生成 -open 呼出 close ×
  13. 13. 値を受け取る • ブロックは、値を受け取れる。 • 何を幾つ受け取れるかは、メソッド次第。
  14. 14. 値は受け取らなくてもいい 2.times{|i| puts i} # 0 # 1 2.times{puts ’こんにちは’} # こんにちは # こんにちは
  15. 15. Hash の例 people = {matz: 49, dhh: 34} # = {:matz=49, :dhh=34} people.each{|person| p person} # [:matz, 49] # [:dhh, 34]
  16. 16. Hash の例 (2) people = {matz: 49, dhh: 34} people.each do |name, age| puts #{name}(#{age}) end # matz(49) # dhh(34)
  17. 17. each cons の例 midosuji = [梅田, 淀屋橋, 本町, 心斎橋, なんば] midosuji.each_cons(2){|path| p path} # [梅田, 淀屋橋] # [淀屋橋, 本町] # [本町, 心斎橋] # [心斎橋, なんば]
  18. 18. each cons の例 (2) midosuji.each_cons(2) do |from, to| p #{from} - #{to} end # 梅田 - 淀屋橋 # 淀屋橋 - 本町 # 本町 - 心斎橋 # 心斎橋 - なんば
  19. 19. each cons の例 (3) a = [*0..3] # = [0, 1, 2, 3] a.each_cons(3){|i| p i} # [0, 1, 2] # [1, 2, 3] a.each_cons(3){|i, j| p [i, j]} # [0, 1] # [1, 2]
  20. 20. ブロックを受け取るメソッド • こんな感じで呼びたい monta{puts ’block!’} # block! # block! # 大切なことなので
  21. 21. ブロックを受け取る def monta yield yield puts ’大切なことなので’ end
  22. 22. ブロックを受け取る (2) def monta(block) block.call block.call puts ’大切なことなので’ end
  23. 23. 値を渡す def monta yield ’大切なことなので’ yield ’大切なことなので’ end monta{|i| puts i} # 大切なことなので # 大切なことなので
  24. 24. 値を渡す (2) def monta(block) block.call ’大切な’, ’ことなので’ block.call [’大切な’, ’ことなので’] end monta{|i| p i} # 大切な # [大切な, ことなので]
  25. 25. 値を渡す (3) def monta(block) block.call ’大切な’, ’ことなので’ block.call [’大切な’, ’ことなので’] end monta{|i, j| p #{i}, #{j}} # 大切な, ことなので # 大切な, ことなので
  26. 26. ブロックは Proc block = Proc.new do |i, j| puts #{i}#{j} end monta(block) # 大切なことなので # 大切なことなので
  27. 27. 演習問題 0 今日のレッスンで分からなかったこと、疑問に 思ったことをグループで話し合ってみよう。
  28. 28. 演習問題 1 0 から 9 までの数値をもつ配列 a がある。 • 各要素を順番に表示しよう。 • 各要素を 2倍した値を持つ配列を作ろう。 • 全要素の合計値を計算しよう。 a = (0..9).to_a a # = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  29. 29. 演習問題 2 0 から 9 までの数値をもつ配列 a がある。 奇数の要素だけを持つ配列を作ろう。 ただし odd? メソッドは使用禁止。
  30. 30. 演習問題 3 Enumerable#map を自作してみよう。 module Enumerable def my_map …… end end ただし Enumerable#map と Enumerable#map! は使用禁止。
  31. 31. 自己紹介 • 名前 (ニックネーム) • 普段の仕事・研究内容・代表作 • Ruby歴・コンピュータ歴 • 勉強会に来た目的 • などなど
  32. 32. 参考 • 公式サイト https://www.ruby-lang.org/ • るりま http://docs.ruby-lang.org/ja/ • 解答例 https://github.com/higaki/ learn_ruby_kansai_62

×