SlideShare a Scribd company logo
2016年1月9日
Ruby初級者向けレッスン 56回
— ブロック —
ひがき @ Ruby関西
お品書き
• ブロックとは?
– 繰り返し
– Enumerable
• メソッドにブロックを渡す
• ブロックで値を受け取る
• メソッドでブロックを受け取る
• ブロックに値を渡す
繰り返し
a = [’a’, ’b’, ’c’]
a.each do |i|
puts i
end
# >> a
# >> b
# >> c
繰り返し
a = [’a’, ’b’, ’c’]
a.each{|i| puts i}
# >> a
# >> b
# >> c
Enumerable
• 繰り返しを行なうクラスのためのモジュール
• クラスには each メソッドが必要
Array.ancestors
# => [Array, Enumerable, Object, Kernel,
Hash.ancestors
# => [Hash, Enumerable, Object, Kernel,
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, i| s + i} # => 6
a.find{|i| i.odd?} # => 1
a.all?{|i| i.even?} # => false
a.any?{|i| i.even?} # => true
array.map{|i| i * i}
アプリケーション ブロック オブジェクト
-生成
§
¦
¤
¥{|i| i * i}
-map
 呼出
ブロックを渡す
• メソッドには、ブロックをひとつ渡せる。
• ブロックをどう使うかは、メソッド次第。
open(’hello.txt’) # = #File:hello.txt
open(’hello.txt’){|f| f.read}
# = こんにちはn
ファイル入出力の例
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: 50, dhh: 36}
# = {:matz=50, :dhh=36}
people.each do |person|
p person
end
#  [:matz, 50]
#  [:dhh, 36]
Hash の例 (2)
people = {matz: 50, dhh: 36}
# = {:matz=50, :dhh=36}
people.each do |name, age|
puts #{name}(#{age})
end
#  matz(50)
#  dhh(36)
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, j]}
#  [0, 1]
#  [1, 2]
ブロックを受け取るメソッド
• こんな感じで呼びたい
x3{puts ’Ruby3’}
#  Ruby3
#  Ruby3
#  Ruby3
ブロックを受け取る
def x3 def x3(block)
yield block.call
yield block.call
yield block.call
end end
x3{puts ’Ruby3’} #  Ruby3
#  Ruby3
#  Ruby3
値を渡す
def x3 def x3(block)
yield 0 block.call 0
yield 1 block.call 1
yield 2 block.call 2
end end
x3{|i| puts Ruby#{i}} #  Ruby0
#  Ruby1
#  Ruby2
ふたつの値を渡す
def x3
yield ’Ruby’, 0 # 文字列 と 数値
yield ’Ruby’, 1
yield [’Ruby’, 2] # ひとつの配列
end
ふたつの値を渡す (2)
x3{|i, j| p #{i} #{j}}
#  Ruby 0
#  Ruby 1
#  Ruby 2
ふたつの値を渡す (3)
x3{|i| p i} # ひとつの変数で受けとる
#  Ruby
#  Ruby
#  [Ruby, 2]
ブロックは Proc
block = Proc.new do |i, j|
puts #{i}#{j}
end
x3(block)
#  Ruby0
#  Ruby1
#  Ruby2
演習問題 0
今日のレッスンで分からなかったこと、疑問に
思ったことをグループで話し合ってみよう。
演習問題 1
0 から 9 までの数値をもつ配列 a がある。
• 各要素を順番に表示しよう。
• 各要素を文字列にした配列を作ろう。
• 各要素を 2倍した値を持つ配列を作ろう。
• 全要素の合計値を計算しよう。
a = (0..9).to_a
# = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
演習問題 2
0 から 9 までの数値をもつ配列 a がある。
奇数の要素だけを持つ配列を作ろう。
ただし odd? メソッドは使用禁止。
(これは Enumerable を使ったパズルです)
a = [*0..9]
# = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a. Enumerable メソッド { 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_kansai_70

More Related Content

PDF
Ruby初級者向けレッスン 50回 ─── ブロック
PDF
実はこんなこともできる Fireworksの裏技
PDF
minami.rb最初で最後のLT大会「Wakayama.rbの紹介」
PPTX
Zshって最強らしい
PPTX
Windowsでも使えるシェル
PDF
Interactive Music II SuperCollider入門 2 - 関数とUGen
PDF
松江Ruby会議05 dxruby
PDF
Bitbucket Pull Request 練習帳
Ruby初級者向けレッスン 50回 ─── ブロック
実はこんなこともできる Fireworksの裏技
minami.rb最初で最後のLT大会「Wakayama.rbの紹介」
Zshって最強らしい
Windowsでも使えるシェル
Interactive Music II SuperCollider入門 2 - 関数とUGen
松江Ruby会議05 dxruby
Bitbucket Pull Request 練習帳

What's hot (6)

ODP
松江Ruby会議05 dxruby
PDF
板ポリだけで めちゃカッコいい グラフィックスを出す!
PDF
Vim の話
PDF
怠惰なRubyistへの道
KEY
GTC2011 Japan
PDF
WPD-Fes #3 2015年のサバイバル学習術 Web開発技術の税引後利益 を最大化しよう!
松江Ruby会議05 dxruby
板ポリだけで めちゃカッコいい グラフィックスを出す!
Vim の話
怠惰なRubyistへの道
GTC2011 Japan
WPD-Fes #3 2015年のサバイバル学習術 Web開発技術の税引後利益 を最大化しよう!
Ad

Similar to Ruby初級者向けレッスン 56回 ─── ブロック (20)

PDF
Rubyist生活に欠かせないブロック構文の話
PDF
Ruby初級者向けレッスン KOF2015 出張版
PPTX
Ruby講座第二回
PDF
Rubyを楽しくする第一歩!ブロックを理解する!
PPTX
第3回輪講
PPTX
Ruby4章
PPTX
Ruby4章
PPT
Start!! Ruby
PDF
Ruby&Active Support for expert 3
PDF
Rubyにメソッドを追加して遊ぶ話
PDF
Ruby初級者向けレッスン 53回 ─── Array と Hash
PDF
Ruby でつくる型付き Ruby
PPTX
Ruby enumerable source code reading
PDF
現実世界のJRuby(ショートバージョン)
KEY
Rails基礎講座 part.1
PPT
第1部「一時間で覚えるruby」
PDF
Ruby の文字列について
PDF
怠惰なRubyistへの道 fukuoka rubykaigi01
PDF
PDF
Rubyメソッド探索
Rubyist生活に欠かせないブロック構文の話
Ruby初級者向けレッスン KOF2015 出張版
Ruby講座第二回
Rubyを楽しくする第一歩!ブロックを理解する!
第3回輪講
Ruby4章
Ruby4章
Start!! Ruby
Ruby&Active Support for expert 3
Rubyにメソッドを追加して遊ぶ話
Ruby初級者向けレッスン 53回 ─── Array と Hash
Ruby でつくる型付き Ruby
Ruby enumerable source code reading
現実世界のJRuby(ショートバージョン)
Rails基礎講座 part.1
第1部「一時間で覚えるruby」
Ruby の文字列について
怠惰なRubyistへの道 fukuoka rubykaigi01
Rubyメソッド探索
Ad

More from higaki (11)

PDF
Ruby初級者向けレッスン 55回 ─── 例外
PDF
Ruby初級者向けレッスン 54回 ─── クラス
PDF
初級者向けレッスン 52回 ─── 文字列
PDF
初級者向けレッスン 51回 ─── 例外
PDF
PHPer のための Ruby 教室
PDF
Ruby 初級者向けレッスン 49回───クラス
PDF
Ruby初級者向けレッスン 48回 ─── Array と Hash
PDF
Ruby初級者向けレッスン 47回 ─── 文字列
PDF
Ruby初級者向けレッスン 第46回 ─── Test::Unit
PDF
ジュンク堂書店の方から来ました
PDF
Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 55回 ─── 例外
Ruby初級者向けレッスン 54回 ─── クラス
初級者向けレッスン 52回 ─── 文字列
初級者向けレッスン 51回 ─── 例外
PHPer のための Ruby 教室
Ruby 初級者向けレッスン 49回───クラス
Ruby初級者向けレッスン 48回 ─── Array と Hash
Ruby初級者向けレッスン 47回 ─── 文字列
Ruby初級者向けレッスン 第46回 ─── Test::Unit
ジュンク堂書店の方から来ました
Ruby初級者向けレッスン 45回 ─── 例外

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