【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 のところは、JavaのEnum・Iteratorを知っていたのでわりかし楽に読めた。
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日目です。