読者です 読者をやめる 読者になる 読者になる

せかいや

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

【Ruby】パーフェクトRuby 学習感想文 ~第5章

それでは5章を読んでいきます。

(参考・経緯など)
パーフェクトRuby 学習感想文 ~はじめに


 

全体的に

5章もすごく読みやすかった!


 

P143 誤植だと思う

誤 :floor 自身と等しいか、自身より小さい整数のうち最小のものを返す
正 :floor 自身と等しいか、自身より小さい整数のうち最大のものを返す


 

P153 誤植だと思う

誤 :str.split(/,\s+/, 2) ⇒["Alice", "Bob", "Chalie"]
正 :str.split(/,\s+/, 2) ⇒["Alice", "Bob, Chalie"]


 

P155 =~ の説明が出てきた。

P76の時点で説明が欲しかった><


 

P181 誤植だと思う

誤 :hash = {foo: 1, bar: 2, baz:3}
正 :hash = {foo: 1, bar: 2, 'baz'=> 3}


 

P185  ->ってなんだ

hash_default.default_proc = ->(hash, key) {Time.now}

という一文の、 -> ってなんだ?はじめてみるぞ。
手を動かして確認。

■hoge7.rb

hash_default = {}

hash_default.default_proc = ->(hash, key) {Time.now}
p hash_default['foo']  #←2013-08-17 20:22:33 +0900 が表示

誤植かと思ったけれど、正しく実行できてる。


公式リファレンス↓

->(a,b){ p [a,b] }
Ruby1.9 で導入された lambda の新しい記法。以下と同じ。

lambda{|a, b| p [a, b] }

http://doc.ruby-lang.org/ja/1.9.3/doc/symref.html

lambdaって・・?無名関数みたいなものらしい。
今の理解はここまで。

Enumrator のところは、JavaEnumIteratorを知っていたのでわりかし楽に読めた。


 

P190 lazy と take って?

■記載コード

(0..Float::INFINITY).lazy.map{|n|
	puts "map: #{n}"
	n.succ

}.select{|n|
	puts "select: #{n}"
	n.odd?
}.take(3).force

 
■記載されている結果

map: 0
select: 1
map: 1
select: 2
map: 2
select: 3
map: 3
select: 4
map: 4
select: 5

なんだかよくわからない。take(3)って、
「必要な分だけ計算された結果を得ることができます」という文面からすると
3つの要素が欲しいのかな、と思うのだけれども。なぜ5つも出ているのか。
あれこれ実験してみた。

(1)n.odd? を消すと出力がとまらない
「なんでn.odd? って行があるのだろう」と思っていたけれど
Rubyルールの「処理結果の最後の行がリターンされる」っていうルールに従ってる。
take(3)メソッドのレシーバーがtrue か false かってことかな。
もっと平たく言えば、select()の結果がfalseだと
take・forceメソッドは実行されなくて延々処理を繰り返す、、ってことか。

(2).take(3)は「奇数が3つ出た時点」で処理がとまっている
この(1)の推測を元に眺め返してみると、trueが3回来た時点で処理が終わっている。
なるほど。


最後のほうのThread・Proces・Strct、に関しては流し読み程度。
必要になるときが来るのだろうか・・・!?

次章からは「メタプログラミング」
ここまでで、学習2日目です。