【Ruby】クラス・オブジェクト・メソッドの定義

ABOUTこの記事をかいた人

気になること&知らないことをひたすらググることを得意としています。このブログでは最近気になったことを中心に記事を書いていきます。記事には間違った情報を書かないように細心の注意を払っていますが、もし誤りがあった場合はコメントやお問い合わせフォームからご指摘いただければ幸いです。

クラスを定義するには下のように記述します。

このような記述方法でクラスを定義し、「こんにちは」と表示されるメソッドを作ってみます。

こんにちは

無事「こんにちは」と表示されましたね。まず1行目のclass文で新しく「HelloRuby」というクラスを定義しています。

定義する際に注意すること
クラス名は必ず大文字から始める決まりになっています
新しいクラス名を定義すればそれに準じる「メソッド」を作ることができます。今回の場合は「hello」というメソッドを作成しました。このhelloメソッドは文字列「”こんにちは”」と出力されるだけの処理内容です。

クラスとメソッドを作成すれば「new」メソッドを使って「HelloRuby」クラスのオブジェクト(インスタンス)を作成します。オブジェクトが作成できれば、後は「オブジェクト名.メソッド名」と書いて上げれば処理を行うことができるようになります。

newメソッドでオブジェクトを作成すると?

newメソッドを使ってクラスのオブジェクトを作成すると自動的に「initializeメソッド」が呼ばれています。「newメソッド」から渡した引数は「initializeメソッド」へと渡されることになります。

今回はnewメソッドを使ってオブジェクトを定義した際に「こんばんは」という文字列を「initializeメソッド」に渡してみましょう。

こんばんは
こんにちは

今回もさっきと同じように「HelloRuby.new」と記述し「HelloRuby」クラスから新しいオブジェクト「aisatu」を作成しました。今回はnewメソッドの後ろに引数を記述しています。この「new(“こんばんは”)」の引数「”こんばんは”」が「initialize(evening)」の「evening」に代入されることになります。「evening」に代入された文字列「”こんばんは”」はinitializeメソッドの処理でputsされています。

結果的にinitializeメソッドから「”こんばんは”」と、helloメソッドから「”こんにちは”」と出力が行われることになります。

インスタンス変数

通常の場合、「def~end」内で定義したメソッドで使われている変数は他のメソッドへと渡すことができません。しかし、「@変数」と記述し、インスタンス変数を作れば同じインスタンス(オブジェクト)内で情報を共有することができるようになります。

こんにちはこんばんは

今回は「evening」に渡した文字列「”こんばんは”」を「@goodevening」というインスタンス変数に代入しています。インスタンス変数「@goodevening」は「hello」メソッド内でも使うことができるので今回の場合は「こんにちはこんばんは」と文字列が出力されています。

また、インスタンス変数はインスタンス(オブジェクト)ごとに値を保持することができるので下のように複数オブジェクトを作った場合、「@goodevening」メソッドは異なるそれぞれの値を持つことができます。

こんにちはこんばんは
こんにちはおはよう
こんにちはへろー

【補足】helloメソッドに引数をつけてみる

ここまでやってくれば大体分かるとは思いますが、上記で作成していた「helloメソッド」にも引数を渡すことができます。

こんにちはこんばんはやぎちゃん

6行目にて「def メソッド名(引数)」と記述を行いメソッド名と引数を定義しておきます。そして12行目で「オブジェクト.メソッド(引数)」と記述して引数を渡し、処理を行っています。

結果的に下記の3つの文字列が結合して出力されることになります。

  • 「こんにちは」
  • newメソッドからinitializeメソッドへと渡され、インスタンス変数となった「”こんばんは”」
  • helloメソッドの引数「”やぎちゃん”」

インスタンス変数の情報にアクセスしたい場合

インスタンス変数の情報を参照したり、書き換えたりする場合は次のような記述を行えばOKです。まずはインスタンス変数の情報を参照してみましょう。

インスタンス変数の参照方法

こんばんは

今回の場合、「reference」というメソッドを作り、そのメソッド内にインスタンス変数「@goodevening」を記述し、これを戻り値としています。そうすることで「aisatu.reference」とメソッドを呼び出せば、インスタンス変数の値が返ってくるので「@goodevening」の値を参照することができるようになります。

attr_readerメソッド

また、Rubyではこのようなめんどくさい記述を行わなくても下記のように「attr_reader :参照したいインスタンス変数名」と記述すれば自動的に同名の参照メソッドを作ってくれます。

こんばんは

今回はインスタンス変数「@goodevening」の値を参照したいので「attr_reader :goodevening」と入れてみました。そうすることでインスタンス変数と同名の「goodevening」という名前の参照メソッドが作られることになります。

メソッドの定義が行われたので「aisatu.goodevening」でメソッドを呼び出してあげればインスタンス変数「@goodevening」の値を参照することが可能となります。

インスタンス変数の値を変更

次はインスタンス変数の値の変更方法をみていきましょう。インスタンス変数の値を変更するには下記のような記述を行います。

こんにちはこんばんは
こんにちはおはよう

このように記述を行えば「@goodevening」の値を変更することができるようになります。具体的にはまず、6~8行目で引数から与えられた「newname」をインスタンス変数「@goodevening」に代入するように記述をおこないます。そして、17行目で「change」メソッドに「”おはよう”」という引数を渡しているのでその文字列がそのまま「@goodevening」に代入されてインスタンス変数の値を書き換えています。

attr_writerメソッド

また、インスタンス変数を書き換えるときも「attr_writer」というメソッド使えば簡単に書き換えメソッドを定義することができます。具体的には「attr_writer :書き換えたいインスタンス変数名」と記述を行うとそれと同名の書き換え専用メソッドを自動的に作ってくれます。

こんにちはこんばんは
こんにちはおはよう

今回は2行目に「attr_writer :goodevening」と記述したのでインスタンス変数「@goodevening」の値を変更するためのメソッド「goodevening」が自動的に作られています。

そこで15行目の記述のようにgoodeveningメソッドを呼び出して値を代入してあげれば「”おはよう”」という文字列にインスタンス変数「@goodevening」の値が書き換えられることになります。

attr_accessorメソッド

attr_accessorメソッドを記述すれば、インスタンス変数の値の参照と変更のメソッドを同時に定義することができます。

こんにちはこんばんは
こんばんは
こんにちはおはよう

値の参照と変更は「attr_reader」「attr_writer」メソッドのときと同じ記述方法でOKです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ABOUTこの記事をかいた人

気になること&知らないことをひたすらググることを得意としています。このブログでは最近気になったことを中心に記事を書いていきます。記事には間違った情報を書かないように細心の注意を払っていますが、もし誤りがあった場合はコメントやお問い合わせフォームからご指摘いただければ幸いです。