Hit the books!!

プログラミング学習記録

Rubyリファレンスマニュアルを読む訓練

エンジニアになりたい!と思ってから、いやそんなの関係なしにこれまでの生活において、英語が読めたほうが(もちろん喋りもできたほうが)いいということは常に心にあった。エンジニアになりたいというのならなおさら。

日頃の勉強にプラスして、英語のニュースとかマニュアルとかを少しずつ読んでいくことを自分に課そうかなと思ってたんだけど、待てよ...その前に私はRubyのリファレンスもちゃんと読めてないなと気づいたのであります。日本語なのに。まずはこっちを克服するのが先だ。

難しさの原因

まず自分の「読めてない感」の原因は何だろう??と考えてみた。

  • 苦手意識(アレルギーみたいなもの)
  • 細かい表記方法を理解していない
  • 実際に手を動かす作業が足りない

経験を積めば克服できるかも!?というか、経験でしか解決できない気がする。

訓練手順

説明をよく読む

マニュアルのヘルプを読む

こんなページがあるとは最初知らなかったけど、いろんなヒントが書いてある。

参考サイト

Rubyリファレンスマニュアルの読み方をやさしく解説 - Qiitaも参考にした。

実際に読んでみよう(delete_ifの例)

実際に、例として最近調べたdelete_ifを読んでみる。

まず上のこの部分から f:id:ud_ike:20200914131059p:plain

であることがわかる。

次に本文の

要素を順番にブロックに渡して評価し、その結果が真になった要素をすべて削除します。 delete_if は常に self を返しますが、reject! は要素が 1 つ以上削除されれば self を、 1 つも削除されなければ nil を返します。

これは最初の

delete_if {|x| ... } -> self

reject! {|x| ... } -> self | nil

この2行のことですね。この2つの違いは| nilがあるかないか。 実際にirbで動かしてみよう。

irb(main):001:0> a = [0, 1, 2, 3, 4, 5]
irb(main):002:0> a.delete_if{|x| x % 2 == 0}
=> [1, 3, 5]

削除するものがない場合は元の配列が返される。

irb(main):003:0> a = [0, 1, 2, 3, 4, 5]
irb(main):004:0> a.delete_if{|x| x == 6}
=> [0, 1, 2, 3, 4, 5]

一方、reject!は...

irb(main):005:0> a = [0, 1, 2, 3, 4, 5]
irb(main):006:0> a.reject!{|x| x % 2 == 0}
=> [1, 3, 5]

削除するものがない場合はnilを返す。

irb(main):007:0> a = [0, 1, 2, 3, 4, 5]
irb(main):008:0> a.reject!{|x| x == 6}
=> nil

では本文の次の行。

ブロックが与えられなかった場合は、自身と reject! から生成した Enumerator オブジェクトを返します。返された Enumerator オブジェクトの each メソッドには、もとの配列に対して副作用があることに注意してください。

これに対応するのが

delete_if -> Enumerator

reject! -> Enumerator

この2行。 "Enumerator オブジェクト"という難しい言葉が出てきたけどとりあえずムシしておきましょう。

irb(main):009:0> a = [0, 1, 2, 3, 4, 5]
irb(main):010:0> a.delete_if
=> #<Enumerator: [0, 1, 2, 3, 4, 5]:delete_if>

この結果である#<Enumerator: [0, 1, 2, 3, 4, 5]:delete_if>がEnumerator オブジェクトってことで理解しよう。

もとの配列に対して副作用がある

ということの確認。

irb(main):011:0> a = [0, 1, 2, 3, 4, 5]
irb(main):012:0> del = a.delete_if
irb(main):013:0> del.each{|i| i % 2 == 0}
=> [1, 3, 5]
irb(main):014:0> p a
[1, 3, 5]

確かに、もとの配列aも[1, 3, 5]になってる!

まとめ

私のような初心者(かつ理解がはやいほうではない)は、ここまで丁寧に読んではじめて「なんかわかったかも〜」っていう状態になれる気がする。 普段いろんなメソッドを調べてるけど、課題を進めることを優先させてひとつのメソッドについてここまで深掘りしていない。

今後は勉強をしていく中で出てきたメソッドやしくみを、もうちょっと深く調べていこう。そうしているうちにリファレンスをスラスラと読めるようになってたらいいな...!!