せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【Ruby】パーフェクトRuby 学習感想文 ~余談:ブロック関数とは?理解から自作まで(その2)

 
ブロックを理解する、続きです。
長くて登録できなかった。

 

ブロックパラメーターを使ってみる

公式ガイド↓
yield に渡された値はブロック記法において | と | の間にはさまれた 変数(ブロックパラメータ)に代入されます。
http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fcall.html#yield

 
ふむ。やってみよう。

def hoge
	p "aaa"
	yield "hoho"
	p "ccc"
end

hoge do |x|
	p x
end

■実行結果

"aaa"
"hoho"
"ccc"

なるほど。
 
今まで、「ブロックパラメータにはdoの左辺の返り値が入る」と思ってたけど
大いなる勘違いだ!
今まで見てきたブロックを扱うクラスが、そういう風に実装されていただけ、だ。

 
Fileのコード、

File.open("hoge.txt") do |f|
  puts f.read
end

ここでやっていることは


こういう感じで自分も実装してみよう。


 

ブロック渡し関数を自作

class Human
	attr_accessor :name, :age
	
	def initialize(name)
		@name = name
		@age = 30
	end
	def self.create(name)
		yield self.new(name)
	end
end

Human.create("tanaka") do |hito|
	p hito.name
	p hito.age
end

■実行結果

"tanaka"
30

やった!出来た!

ポイントは、

  • createメソッド内でnewメソッドによりインスタンスを作る
  • 作成したインスタンスをyield の引数に渡す
  • initializeメソッド内で、createメソッドの引数"tanaka"を利用する


ブロック変数が少し分かったぞ!
ありがとう師匠!
ありがとうパーフェクトRubyの作者さん達!