読書メモ:ゼロからわかるRuby超入門

下記の本を読んだので備忘としてメモを書いた(個人的に印象に残った部分のみ)。

ゼロからわかる Ruby 超入門 (かんたんIT基礎講座) | 五十嵐 邦明, 松岡 浩平 |本 | 通販 | Amazon

--------

2章:かんたんなプログラムをかく

  • irb(Rubyの対話型インターフェース)は.rbファイルの中でbinding.irbを記載することでプログラムを一時停止できる(変数を参照したりするときに使う)
  • pメソッドとputsメソッドは似ている(おそらく標準出力に出力する)が、pメソッドはデバッグの道具として使う。プログラムの機能として意図して表示するときには puts を使う。

3章:処理の流れを変える

  • caseには2つ書き方がある
    • caseの後に変数を書きwhenで変数の値を記載する
    • caseの後に変数を書かず、when のあとに条件式を記載する
  • x回の繰り返しは下記のように書く
    • x.times do 処理 end
    • x.times { 処理 }

4章:まとめて扱う - 配列

  • 特になし

5章:便利な道具を使う

  • プログラミング言語 Ruby リファレンスマニュアル」というWebページがあり、組み込みライブラリで組み込みのメソッドが確認可能(例:配列のuniq)

    https://docs.ruby-lang.org/ja/

  • 末尾に ! が付くメソッド(例:uniq!)は、オブジェクトを破壊的に変更するものが多い

  • Rubyには「ブロックを渡せるメソッド」が存在する

    #例(メソッドの後ろにブロックを記載する)
    p [1, 3, 2, "2", "3"].uniq { |n| n.to_s } # => [1, 3, 2]
  • mapメソッドは配列の各要素を変換した配列を作るメソッドだが、map含むいくつかのメソッド(呼び出すだけのもの)のブロックには短い書き方がある。次は全て同じ処理を実行する。

    # 配列の変換処理
    result = ["abc", "123"].map do |text| 
    	text.reverse
    end
    # ブロックを使った書き方
    result = ["abc", "123"].map{|text| text.reverse}
    # シンボル(:)を使った書き方
    result = ["abc", "123"].map(&:reverse)
    
  • classメソッドとクラスメソッドがややこしかったが後者は一般的なクラスメソッド(8章に記載)で前者はレシーバのクラスを返すメソッドのこと(英語圏ではどう使い分けされている?)。

6章:組で扱う - ハッシュ

  • p145, ハッシュをpメソッ ドに渡すときには括弧を省略できない(シンボルはコロン記号(:)から始める):

    p( {:coffee => 300, :caffe_latte => 400} )
    
  • p146, ハッシュのキーにシンボルを指定したときのみ使える書き方がある

    # ハッシュのキーにシンボルを指定した場合のみ使える
    {coffee: 300, caffe_latte:400}
    # ハッシュのキーに文字列などシンボル以外のオブジェクトを使うとき
    {"コーヒー" => 300, "カフェラテ" => 400}
    

7章:小さく分割する - メソッド

  • 特になし

8章:部品をつくる - クラス

→ p204, レシーバはメソッド呼び出す際の呼び出し元のオブジェクトのことで、インスタンスまたはクラスのいずれかになる。レシーバがインスタンスのメソッドがインスタンスメソッドであり、レシーバがクラスのメソッドがクラスメソッドになる。

クラスメソッドはdef self.メソッド名で定義する

  • p192, クラスの中で(=インスタンスメソッド/クラスメソッドの定義内で)メソッドを呼び出すときはレシーバとドット(.)を省略してメソッド名だけで呼び出せる

  • p195, メソッド定義の中でインスタンス変数とローカル変数の使い分けはどのようにすればいいか?インスタンス変数は便利に見えるが、その分メモリを消費するはずなので(実装を左右するレベルかは不明だが)、基本はローカル変数にしておいて、他のメソッドも使う可能性がありそうならばインスタンス変数にしておくのが良いのではないかと思った

    インスタンス変数はその名の通り、 インスタンス(オブジェクト)が持つ変数です。ローカル変数と違って、同じオブジェクトであ れば、複数のメソッドをまたいで使うことができます。寿命もオブジェクトと同じになり、オブ ジェクトが存在する間ずっとインスタンス変数を使うことができます。

  • p214, レシーバを書かないでメソッドを呼び出す方法は、そのクラス定義内のインスタンスメソッドの中で定義すること

    →クラスメソッド内でレシーバを記載せずにメソッドを呼び出すことはできない(検証済み)

  • private なメソッドを定義するとレシーバを省略できるところだけで呼び出せるので、結果的に、メソッドを呼び出すことができる場所をクラス定義の中だけに限定できる(レシーバから直接呼び出さずに他のメソッド経由でしか呼び出せないようにできる)

9章:部品を共同利用する - モジュール

  • p224, モジュールの優れたところは、複数のクラスで使えるところ

  • p227, あるモジュールのメソッドをあるクラスのクラスメソッドとして呼び出したい場合、extendを使うが元のモジュールではインスタンスメソッドとして定義しておく必要があることに注意する

  • p228, モジュールはクラスと違いインスタンスを作ることができないが、クラスメソッドや定数をまとめるときには、使い方に迷わないため便利

  • p233, includeとrequire_relativeの違い:

    includeはモジュール名を渡して、そのモジュールに書かれたメソッドをクラスから利用できるようにするメソッドです。require_relativeは、ファイル名を渡してそのファイルに定義されたクラスやモジュールを使えるようにするメソッドです。セットで使うことも多いこの 2 つですが、それぞれ機能が違います。

10章:Webアプリをつくる

  • debugについて

    標準添付ライブラリ debug は、irb のように 1 行ずつプログラムを実行できる機能に加えて、 デバッグに便利な機能を持っています。debugには2つの使い方があります。1つ目はrubyコマンドのように、コマンドプロンプトからrdbgファイル名 で実行する方法。2 つ目はプログ ラム中でrequire "debug"とbinding.breakの2行を書いて、そこで一時停止して、入力し たプログラムを実行する方法です。一時停止中に n コマンドを打つとプログラムを 1 行ずつ実行し、 c コマンドで実行を再開します。P.61 〜 63 の irb についての説明を参考に使ってみてください。

11章:使いこなす

    • p267, 本文中で見落としているのかもしれないが、クラスの中で下記のようなメソッド定義をよく見かけるがどのような文法なのか?(単なるSetterとは思われる)

      def name=(text)
      	@name = text 
      end
      

      → 読み返すとp198に下記の記載有り

      インスタンス変数へ代入するメソッドは、慣習的に「インスタンス変数名から @ を取り、末尾 に = を加えたもの」にすることが多いです。

    • p267, コロンの右のインスタンス変数へのgetter, setterは下記のように記載する(まとめてattr_accessorでもよい)

      class Drink
      	attr_reader :name 
      	attr_writer :name
      end
      
    • p270, インスタンス変数の持ち主は self が指すオブ ジェクトなのでクラスメソッドとインスタンスメソッドでのインスタンス変数は同名であっても別物

    • p276, ブロックを渡すことができるメソッドの例としてdice の例が記載されているがブロックを渡すこと(yield)の使いどころがよくわからない。

      yield を使うと、メソッドの中で実行する処理を、メソッド呼び出し元にブロックで書くことができます

      とのことだが、本来メソッドに条件分岐を使って記載できるロジックを、メソッド呼び出し元にブロックで記載できることの何が嬉しいのかよく分からなかった(本ではそこまではあえて説明していないのだと思われるが)。

    • p277, ブロックをProcオブジェクトとして変数に格納しメソッドの引数に渡し(&ブロック変数名で渡す)、その定義の中で&ブロック変数名.call でブロックの処理を呼び出すことができるとのことだが、この例もメソッド内の処理を外出しにしただけに見え、どういう使い所があるのか分からなかった。