よっぴブログ

【技術書メモ8】プロを目指す人のためのRuby入門

 

f:id:yoppi-y:20190713134126p:plain

  

技術書めも8冊目φ(・

今回は「プロを目指す人のためのRuby入門」を読みました。(通称:チェリー本🍒)

説明文の後に必ず例となるコードが書いてあったので、文章で読んで理解できなくても、コードを見ることで理解できました!

また、正しい使い方だけではなく、避けた方がいい使い方なども書いてあったので、注意すべき点が明確になり分かりやすかったです。

 配列と繰り返し処理を理解する

・ブロックとは

メソッドの引数として渡すことができる処理のかたまり。ブロック内で記述した処理は必要に応じてメソッドから呼び出される。

Rubyでは「要件を問わず共通する処理」はメソッド自身に、「要件によって異なる処理」はブロックに分担させて1つの処理を完成させるメソッドが数多く用意されている。
 
eachメソッドの役割は、配列の要素を最初から最後まで順番に取り出すこと。しかし、取り出した要素をどう扱うかはその時の要件で変わってくる。
そこで登場するのがブロック。配列の要素を順番に取り出す作業はeachメソッドで行い、その要素をどう扱うかはブロックに記述する。
 
・配列に初期値を設定する場合の注意点
 
コード例
a = Array.new(5, ‘default’)
a  #=>[“default”, “default”, “default”, “default”, "default"]
 
str = a[0]
str  #=> “default”
 
str.upcase!
str  #=>  “DAFAULT”
 
a  #=>[“DEFAULT”, “DEFAULT”, “DEFAULT”, “DEFAULT”, “DEFAULT”]
 
このように、配列の要素全てが大文字に変わってしまう!
これは、配列の全要素が全て同じ文字列オブジェクトを参照しているために発生する問題。
 
「同じ値で同一のオブジェクト」なのか、「同じ値で異なるオブジェクト」なのか意識してコードを書かないと、思わぬ不具合になってしまうことがある。
 

ハッシュやシンボルを理解する

・シンボルの特徴と主な要素
表面上は文字列っぽいので、プログラマにとって理解しやすい
内部的には整数なので、コンピューターは高速に処理できる
同じシンボルは同じオブジェクトであるため、メモリの使用効率がいい
イミュータブルなので、勝手に値が変えられる心配がない
 
 

クラスの作成を理解する

・equal?
このメソッドはobject_idが等しい場合に、trueを返す。つまり、全く同じインスタンスかどうかを判断する場合に使う。
 
・eql?
このメソッドはハッシュのキーとして2つのオブジェクトが等しいかどうかを判断する。
 

モジュールを理解する

・モジュールの用途
継承を使わずにクラスにインスタンスメソッドを追加する。もしくは上書きする(ミックスイン)
複数のクラスに対して共通の特異メソッド(クラスメソッド)を追加する
クラス名や定数名の衝突を防ぐために名前空間を作る
関数的メソッドを定義する
シングルトンオブジェクトのように扱って設定値などを保持する
 
また、モジュールにはクラスと違って次のような特徴がある
・モジュールから」インスタンスを作成することはできない
・他のモジュールやクラスを継承することはできない
 
・モジュールに特異メソッドを定義する
includeやextendを使うとモジュールのメソッドをクラスにミックスインすることができる。
しかし、場合によってはわざわざ他のクラスに組み込まなくてもモジュール単体でそのメソッドを呼び出したい、と思うケースがある。
こういう場合はモジュール自身に特異メソッドを定義すれば直接”モジュール名.メソッド名”という形でメソッドを呼び出すことができる。
 
・module_functionメソッド
ミックスインとしても使えて、なおかつモジュールの特異メソッドとしても使えるメソッドを定義する場合は、module_functionメソッドを使って、対象のメソッド名を指定する。
ミックスインとしても、モジュールの特異メソッドしても使えるメソッドのことをモジュール関数と呼ぶ。
module_functionでモジュール関数となったメソッドは、他のクラスにミックスインすると自動的にprivateメソッドになる。
 

例外処理を理解する

・例外オブジェクトから情報を取得する
messageメソッドは例外発生時のエラーメッセージを返し、backtraceメソッドはバックトレース情報(つまりメソッドの呼び出し履歴)を配列にして返す。
 
・例外クラスの継承関係を理解する
rescue節に何も指定しなかった場合に捕捉されるのはStandardErrorとそのサブクラスである。
StandardErrorクラスは通常のプログラムで発生する可能性の高い例外を表すクラス。NoMemoryErrorやSystemExitなどStandardErrorを継承していない例外クラスは捕捉されない。
 
・意図的に例外を発生させる
コードの中で意図的に例外を発生させるためには、raiseメソッドを使う。
Raiseメソッドに文字列を渡すと。その文字列がエラーメッセージになる。
 
・rescueしたら情報を残す
あとで原因調査ができるように例外時の状況を確実に記録に残す。
例外をrescueしたらその場で情報を残さないと詳細な情報が失われてしまう。
最低でも、例外のクラス名、エラーメッセージ、バックトレースの3つはログやターミナルに出力すべき。
 

Rubyに関するその他のトピック

Railsのような巨大なプロジェクトになてくると、一度にたくさんのgemを組み合わせてプログラムを構築する。
その各々が正常に動く組み合わせを持っているため、使用するgemが増えるとgem同士の適切な依存関係はあっという間に人間で管理できなくなってしまう。
そこで登場したのがBundlerである。Bundlerを使うと、開発プロジェクトごとにgemの依存関係を適切に管理してくれる。
 

・エラーや不具合に対処する方法
最終手段!パソコンの前から離れる。


トイレに行く
飲み物を買いに行く
外を散歩する
昼寝する
ご飯を食べる
お風呂に入る
その日はもう寝る