ことゆうのOUTPUT

アウトプット成果物の置き場

Rubyの学習(入門書) 2日目(本日1.5H。累計3.5H) 学習メモ

昨日に引き続き、以下の本で勉強していきます。

 

 

本日の進捗:読書 4章~5章(1.5時間) 

コーディング無しの読書のみ+α(関連事項をググったり)。

 

以下に読書中のメモを。

 

P88

元の大きさよりも大きい添え字を指定すると、間の値がnilで埋められます。
a=[1,2,3]
a[4]=50
a #=>[1,2,3,nil,50]

…まるで仮想無限長配列みたいな振る舞いですね。

なんか、OSの仮想メモリを思い出しました。必要な時に確保する、みたいな。
だとしたら、配列範囲外の読み出し値はnilになるのかしら、と思ってググってみたら、そのようですね。

Ruby 配列の要素へのアクセス方法 - かもメモ

 

P93

eachメソッド

戻り値としては何を返すんだろうか、とググってみました。

map, select, collect, each の違いところ - Qiita

戻り値はレシーバ自身だそうです。

それはさておき、上記サイトにおいて、

ブロックは「{」と「}」で囲うか「do」と「end」で囲う2つの方法があります。これらはほぼ同じですが、微妙に動作が違う場合もあるようです。 

というのが目に入ってきたので、ググりました。

ブロックをdo…endで書くか{…}で書くかにより挙動が変わる例 - Qiita

{ ... } の方が do ... end ブロックよりも強く結合するそうです。

こういう優先順位的なまぎれ方、メソッド引数のカッコ有無でも似たようなことがあった気が。

同じことをやるのにいろいろな構文がある(Rubyは特に多そう?)のはいいけれど、逆に微妙な解釈違いや振舞い違いに悩まされそうな予感がします。

まあJavaとかでも可変長引数とか紛れやすそうな構文ありますし、プログラミング言語にはあって当然のものなのかも。

P130

「do...endと{}の結合度の違い」 

…本書においても、後の方でちゃんと説明がありました。

 

P116

二つの配列を連結したい場合はconcatメソッドか+演算子を使います。

…concatメソッドは破壊的メソッドだそうです。これは怖い。。結合した値(実は変化したレシーバ自身)が普通に戻り値として帰ってくるし、メソッドに「!」ついてないし、知らなきゃまぎれの気配さえ感じないですよこれ。。こんなド基本なメソッドは、名に「!」つけてほしい。。というか、配列のメソッドって破壊的メソッドがデフォなのか?と思ってググりました。

【Ruby】「!」が付かない破壊的メソッドまとめ - Qiita

なるほど、たくさんあるんですね。。。個別に慣れるようにします。

 

P117

配列の和集合、差集合、積集合

…集合化(重複削除)と集合演算を一気にやってくれるってのは、いろいろと便利かも。マルチセットとして扱うよりは使い出がある気がします。

 

P118

Rubyには配列よりも効率的に集合を扱えるSetクラスもあります。

…配列での集合演算は、ちょっとした規模の際に使うのがbetterみたいです。

 

P120

「%記法で文字列の配列を簡単に書ける」 

…やっぱり文字列以外にもあったか、という感じです。なんか、シンボルの配列を作る記法ってのもあるらしいです。

 

P122

ただし、第2引数を使って初期値を指定する場合は注意です。
a=Array.new(5,'default')
a #=>["default","default","default","default","default"]
str =a[0]
str.upcase!
a #=>["DEFAULT","DEFAULT","DEFAULT","DEFAULT","DEFAULT"]

…誰得?な仕様な気が。。

初期値埋めにミュータブルな値を共有するって、怖い。罠すぎる。。

他にもいろいろとありそう。。

 

P124

「ミュータブルなオブジェクトはfreezeメソッドを使って変更不可にすることもできます。」

7章の該当部を先読みしたところ、
P257

配列の(略)各要素の値も別途freezeする必要があります。

SOME_NAMES=['Foo'.freeze , 'Bar'.freeze , 'Baz'.freeze].freeze

…ですよねー。。

 

P123

a=Array.new(5){'default'}
a #=>["default","default","default","default","default"]
str =a[0]
str.upcase!
a #=>["DEFAULT","default","default","default","default"]

…私は初期値埋めの際はこの構文の方をなるべく使うことにします。

 

P136

for文の中で作成したローカル変数がfor文の外でも使える

… 。。。私はeachメソッドを使うことにします。

 

P137

「Enumerableモジュール(中略)モジュールやincludeについて(中略)第8章で詳しく説明します」

8章をざっと先読みすると、Rubyではモジュールでミッスクインができるみたいですね。
P297

eachメソッドさえ実装していればEnumerableモジュールをincludeするだけで、このモジュールに定義された50を超えるメソッドが一気に手に入るわけです。

 

 

Rubyって、自由度が高いというかなんというか。。

とにかく、Ruby入門を一通り学習し終わったら、真っ先にアンチパターンを追加学習することにします。あと、有名どころのコーディング規約も。