なんちゃってウェブ系エンジニアの備忘録

某IT企業で働くなんちゃってウェブ系エンジニアが技術やデザインなど役に立ちそうなものなどを備忘録として載せていきます

Ruby 自己学習メモ3

今回は、Rubyのクラスを中心に自己学習した内容をまとめておく。
自己学習メモ2
自己学習メモ1

クラスの定義と呼び出し

Rubyのクラスを定義させるには、以下のようにclassを使うことによって定義できます。

class クラス名
  "ここにクラスの定義等を入れておく"
end

クラス名は大文字で始める必要があるので留意しておく。
「クラス名.new」により、インスタンス化してオブジェクトを生成することができます。
クラスの定義には、変数やメソッド、initializeメソッドを定義します。

Rubyメソッドには4種類があり、まずはインスタンスメソッドとクラスメソッドの違いについてはっきりさせておきたいと思う。

インスタンスメソッド

class Greeting
  def hello(name: "")
    puts "おはよう! #{name}"
  end
end

# クラス呼び出し
g = Greeting.new
# 引数ありの場合
g.hello(name: "山田くん")
# 引数なしの場合
#=> おはよう!山田くん
g.hello
#=> おはよう!

インスタンスメソッドはレシーバをつけて呼び出すメソッドである。
上記の場合ですと、レシーバの値は 「g」となりますね。

クラスメソッド

class Greeting
  def self.hello(name: "")
    puts "おはよう! #{name}"
  end
end

# 引数ありの場合
Greeting.hello(name: "山田くん")
# 引数なしの場合
Greeting.hello

クラスメソッドとは、レシーバがそのままクラス名となり、そのまま呼び出せるメソッドである。
つまり、クラス名がレシーバの役割を果たしているんですね。
オードソックスの書き方としては、後者の形になると思われる。

クラスにおける変数取り扱いについて

クラス内に使える変数は
ローカル変数、グローバル変数インスタンス変数、クラス変数の4種類に分けられ、それぞれの用途や特徴については以下通り。

ローカル変数

変数の先頭文字がアルファベットの小文字 or 「_」で始まるもの。

グローバル変数

変数の先頭文字が「$」で始まるもの。
プログラム全体に対して定義される変数でプログラムのどこからでも参照、変更することができる。

インスタンス変数

変数の先頭文字が「@」で始まるもの。
オブジェクトのクラスを定義する際にその内部で使用される変数として定義されるもの。実行時にインスタンス毎に領域が確保され、それぞれが固有の値を取る。別名メンバ変数と呼ばれることも。

クラス変数

変数の先頭文字が「@@」で始まるもの。
クラス変数はそのクラスの全てのインスタンスで共有される変数。

initializeメソッド

名前通りinitializeメソッドとはインタスタンスを生成したときに必ず呼ばれるもので、主に初期化するときなどに使われます。
もしインスタンスを作る時に初期化しなくてもよい場合はinitializeメソッドを定義しなくても問題ありません。

class Greeting
  def initialize(name: "名無しさん")
    @name = name
  end
  def hello
    puts "#{@name}、おはようございます。"
  end
end

# クラス呼び出し
# 引数ありの場合
g = Greeting.new(name: "山田さん")
g.hello
#=> 山田さん、おはようございます。
# 引数なしの場合
g = Greeting.new
g.hello
#=> 名無しさん、おはようございます。

newに引数があるときは、initializeメソッドの引数に渡されます。