上京エンジニアの葛藤

都会に染まる日々

「初めてのRuby」を読んだ(6章)

ついに、今回を含めて残り3章となりました(9章は資料の紹介とかが多いので割愛予定)、今月中に終わらせたいところ。。
前回の記事はこちら

さて、今回は第6章「変数と式」についてまとめていきます。

変数について

Ruby における変数の特徴として、変数は値ではなく参照を保持する

hoge = "hoge"
bar = hoge # Stringオブジェクト "hoge" の参照を代入しており、変数 hoge と同一のオブジェクトを参照している

puts hoge # => "hoge"
puts bar # => "hoge"

bar = "bar"

puts bar # => "bar"
puts hoge # => "bar"

また、変数宣言をしなくても、変数名の先頭文字で自動的に種類が決まる
先頭文字以降は、ASCII記号をのぞく任意の印刷可能文字とアンダースコアを変数名に使用できる
慣習的には、スネークケースを用いる
予約語こちら

変数の種類・判別に用いる先頭の文字列は以下

ローカル変数

特定のメソッド呼び出し、クラス定義、ファイル実行の中だけで利用できる変数で最もスコープが狭い

def hoge(arg) {
  v = arg
}
def bar(arg) {
  v = arg
}

hoge(123)
bar(123)

hogeメソッドbarメソッド 内の変数 v はスコープが違うので、全く別物

インスタンス変数

特定のオブジェクトに属する変数で、同一のオブジェクトのメソッド間で共有される

クラス変数

その名の通り、クラスに属する変数

グローバル変数

その名の通り、どこからでも参照可能な変数
多用すると、各モジュールとその変数との結合度が上がるためプログラムの保守性を下げる

定数

変更されることのない変数(することはできるが、警告が出る)
HOGE.freeze このように書けば変更することができない

擬似変数

特殊な変数で7つ存在し、代入することができない

  • nil
    「値がない」ことを表す NilClass のインスタンスオブジェクト

  • true
    真の値

  • false
    偽の値

  • self
    「現在の」オブジェクトを表す

  • __FILE__
    ソースファイル名を表す

  • __LINE__
    行番号を表す

  • __ENCODING__
    ソースファイルのエンコーディングを表す

演算子について

大部分はメソッド呼び出しをしやすくするシンタックスシュガーで、 5+55.+(5) というメソッドの呼び出しである
演算子は、ここに到るまでにある程度使用しているので抜粋する

代入演算子

複数の値を一度に代入する方法

a, *b = 1, 2, 3, 4, 5
p a # => 1
p b # => [2, 3, 4, 5]

a, b, c, d = b
p a # => 2
p b # => 3
p c # => 4
p d # => 5

制御式について

case 式の注意点

case 式の範囲分岐は厳密ではない

v = 3
case v
  when 0 then p 0
  when 1..9 then p 1
  when 0 then p 2
end

$ ruby sample.rb
1

v は数値オブジェクトなので、Range オブジェクトとは等しくないはずであるが、該当の範囲にマッチする

例外処理について

例外が予想される部分を begin, end でくくることで範囲内での例外発生時に対応する resucue 節に飛ばすことができる
また raise で例外を意図的に発生させることができる

def sample
  begin
    raise ArgumentError, "hoge"
  rescue ArgumentError => e
    puts e.message
  rescue
    puts "something error"
  end
end

$ ruby sample.rb
hoge

サンプルコードでは、ArgumentError を意図的に発生させ rescue でキャッチし、エラーメッセージを表示している
該当のエラーが ArgumentError 以外の場合、最後の rescue 節でキャッチすることができる