プロを目指す人のためのRuby入門・第2章重要ポイントまとめ
「プロを目指す人のためのRuby入門」の第2章を読み終わりました
個人的に重要と判断したポイントをまとめます。
なお、第1章は開発環境準備のためのチュートリアルです。わたしはWindows10を使用しているため、Windows Subsystem for Linux上でRubyをインストールして使っています。
リテラル
技術書などを見ているとたまに載っていますが、ついつい定義を調べずにいました。
「数字の1や文字列"hello world"のようにRubyのプログラムの中に直接 記述できる値の事」です。
https://docs.ruby-lang.org/ja/latest/doc/spec=2fliteral.html
変数の宣言と代入について
Rubyでは変数を宣言するだけの構文はなく、何かしらの値を代入する必要があります。
x #=> NameError: undefined local variable or method 'x' for main:Object x = nil #=> nil
また、数字から始まる変数名は使えません(関数名の場合も同様)
2_special_price = 300 #=> SyntaxError: trailing '_' in number
以前cssのclass名に数字から始まる名前を付けてしまったため認識されず、ハマってしまったことがあったため、その時のことを思い出しました…。
関数名も変数名も同じ命名規則が適用されます
・アルファベットの小文字、数字、アンダースコアで構成する
・数字から書き始めない
・スネークケースで書く
間違えないように注意したいと思います。
丸め誤差
どうやらコンピュータが2進数で計算する際に、小数点以下に続く数字を適当な桁で切り捨てることが原因で発生する誤差のことのようです。
循環小数を扱うようなイメージでしょうか。
少数を有理数に変換する(Rationalクラスの数値に変換する)ことによって丸め誤差を回避することができます。
0.1 * 3.0 #=> 0.30000000000000004 0.1r * 3.0r #=> 0.3 0.1r.class #=> Rational
変数に値が入っている場合はrationalizeメソッドを呼ぶことでRationalクラスの数値に変換できます。
a = 0.1 b = 3.0 a.rationalize * b.rationalize #=> (3/10)
falseまたはnilであれば偽それ以外はすべて真
オブジェクトがnilかどうかで条件分岐させる式をシンプルに作ることができます。
data = find_data if data 'データがあります' else 'データがありません' end
if文の戻り値と標準出力への出力メソッドの挙動
if文は最後に評価された式を戻り値として返すので、irbで実行する場合はputsを使わなくてもif文の戻りを見ることで条件が実行されたか確認できます。
この性質を利用すれば、戻り値を変数に直接代入することができますが…
country = 'italy' greeting = if country == 'japan' 'こんちゃ' elsif country == 'us' 'ciao' else '???' end greeting #=> "ciao"
しかし、戻り値を変数に代入したい場合に条件分岐の実行処理でputsを使ったらnilが変数に格納されてしまいました。
country = 'italy' greeting = if country = 'japan' puts 'こんちゃ' elsif country == 'us' puts 'ciao' else puts '???' end greeting #=> nil
この結果は、putsメソッドが戻り値としてnilを返すことにより起こりました。
puts 123 #=> 123 => nil
pメソッドなら戻り値として引数のオブジェクトを返すので、意図した値を変数に格納することができます。
country = 'italy' greeting = if country = 'japan' p 'こんちゃ' elsif country == 'us' p 'ciao' else p '???' end greeting #=> 'ciao'
実際にこのようにpメソッドを使うことはないのではないかと思いますが、標準出力への出力メソッドの挙動には注意したいと思います。
Rubyの戻り値とreturn
Rubyは最後に評価された式がメソッドの戻り値になるため、戻り値を返すのにreturnのようなキーワードは不要です
returnはメソッドを途中で脱出する場合に使われることが多いようです。
def greeting(country) #修飾子としてif式を使う return 'countryを入力してください' if country.nil? case country when 'japan', '日本' 'こんちゃ' when 'italy', 'イタリア' 'ciao' else '???' end end
メソッドの引数について
メソッドを呼び出す際に引数の過不足があるとエラーになる
def greeting(country) if country == 'japan' 'こんちゃ' else 'hello' end end #引数が少ない greeting #=> ArgumentError: wrong number of arguments (given 0, expected 1) #引数が多い greeting('japan', 'italy') #=> ArgumentError: wrong number of arguments (given 2, expected 1)
メソッド定義の際、デフォルト値つきの引数を設定しておけば、引数なしでメソッドを呼び出してもエラーになりません
def greeting(country = 'japan') if country == 'japan' 'こんちゃ' else 'hello' end end #引数なし greeting #=> 'こんちゃ' #引数あり greeting('us') #=> 'hello'
変数にはオブジェクトへの参照が格納される
a = 'hello' b = 'hello' c = b #ここで、bとcは同じオブジェクトを参照しており、aは別のオブジェクトを参照している a.equal?(b) #=> false b.equal?(c) #=> true #bに対して破壊的な変更をさせるメソッドを呼び出すと、参照元であるオブジェクトが変更されるため、同じオブジェクトを参照しているcにも影響がある b.upcase! #=> 'HELLO' c #=> 'HELLO'
リテラルについて公式リファレンスを調べているときに気づいたのですが、なんと本書に書いてある内容がリファレンスの解説の役割を担ってくれています…!
公式リファレンスを読んで詰まってしまったらチェリー本を読む。
そんな使い方もできるのではないかと思います!
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)
- 作者: 伊藤淳一
- 出版社/メーカー: 技術評論社
- 発売日: 2017/11/25
- メディア: 大型本
- この商品を含むブログを見る