Ruby on Rails 始めました

Javaやphpはそこそこ書ける程度の人が、Ruby on Railsを一から習得する過程を記したサイト

Rubyの基本文法

Rubyのクラスについてまとめてみた

コンストラクタとインスタンスメソッド

Rubyのクラスの特徴

  • メンバ変数は、@変数名で定義する(特に宣言する必要ない)
  • メンバ変数は全てprivate
  • initializeメソッドが、コンストラクタのこと
  • コンストラクタの呼び方は、クラス名.new(引数)
  • コンストラクタに引数を渡す際は( )を省略することはできない

 コンストラクタも普通のメソッド同様、引数のデフォルト値を設定できる。デフォルト値の無い引数があれば、コンストラクタ(.new)を呼ぶ際には必ず引数として渡さないといけない。

 メンバ変数は特に宣言する必要はなく、@変数名の形で書くだけ。全てのメンバ変数はprivate扱いになるので、外のクラスから触りたい場合は、それぞれの変数に対するアクセサメソッド(ゲッター、セッター)を定義する必要がある。

アクセサメソッド名の名付けの慣習

  • ゲッターのメソッド名は、変数名そのまま
  • セッターのメソッド名は、変数名=

 例えば、
メンバ変数nameのゲッターメソッド名をname
メンバ変数nameのセッターメソッド名をname=
と定義すると、

っていう風な直感的な書き方ができる(直接変数を触っているように見えるが、そうじゃない)。

「=」はメソッド名の一部だが、なぜかこの場合、間にスペースを空けても問題ない。普通はメソッド名の途中にスペースを入れるのはNG。

アクセサメソッド

 Rubyにはアクセサメソッドを簡単に定義する方法が備わっている。

 こうするだけ。
 これだけで変数名の定義と、その変数に対するゲッター、セッターの定義が完了する。

 以下は上記のクラス定義と全く同じ。

 これだけでも十分すごいのに、なんと複数のメンバ変数(及びアクセサメソッド)を一気に作ることができる。その場合、「,」で区切って変数名にコロンを付けてを書くだけ。

 たったこれだけで、3つのメンバ変数(name, age, address)の宣言と、アクセサメソッドの設置が完了する。Javaでやっていたことは何だったのか。

 セッターのみ、ゲッターのみ定義したい場合は、それぞれ以下のようにする。

ゲッターのみ↓

セッターのみ↓

 

以下のように、それぞれ定義していない方を使おうとするとエラーになる。

クラスメソッドの定義と呼び方

 クラスメソッドとは、Javaで言うstaticメソッド。

 クラスメソッドを定義する時は、selfを使う。クラス定義スコープ内ではselfはそのクラス自身を指す(インスタンスではないので注意)。

 selfを使ってそのクラス自身を指すやり方ではなく、そのままクラス名を使っても良い。

 このやり方なら、クラス定義スコープの外部ででもクラスメソッドを定義できるらしいが、どういう時にそんな変なことするのか個人的にはよく分からない。

 複数のクラスメソッドを定義したい場合なんかは、こんな書き方も出来る。

クラス変数

 クラス変数には@@を付ける。

privateメソッド

 Rubyでは普通にメソッドを定義するとpublic扱いになり、クラス外から呼ぶことができる。

 privateメソッドを定義するには、private以下にメソッドを定義する。

privateメソッドの約束事

  • privateメソッドを呼ぶ際は、レシーバを指定できない。
  • レシーバは暗黙的に、selfになっており、それが自クラスのclassオブジェクト or サブクラスのclassオブジェクトである必要がある。

 結果的に、privateメソッドは、自クラスorサブクラスの定義域内でしか呼べない

コメントを残す




関連記事

Pick Up