プロを目指す人のための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'

 
リテラルについて公式リファレンスを調べているときに気づいたのですが、なんと本書に書いてある内容がリファレンスの解説の役割を担ってくれています…!
公式リファレンスを読んで詰まってしまったらチェリー本を読む。
そんな使い方もできるのではないかと思います!