JavaからのRuby on Rails入門

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

calendar

reload

スポンサーリンク

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

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サブクラスの定義域内でしか呼べない

Ruby on Railsの疑問に無料で答えてもらえます↓

この記事をシェアする

コメント

コメントはありません。

down コメントを残す




関連記事

書いている人

Nobuo

Nobuo

一番かんたんなJava入門というサイトを運営しています。Javaやphpは少し分かりますが、Ruby on Railsについては全く何も知らないので、このサイトにアウトプットしながら覚えていこうかと思っています。 [詳細]

folder Rubyの基本文法

more...

folder 初めてのRuby on Rails入門

more...

folder Rails忘備録

more...