クラスを定義するには下のように記述します。
1 2 3 |
class クラス名 クラスの内容 end |
このような記述方法でクラスを定義し、「こんにちは」と表示されるメソッドを作ってみます。
1 2 3 4 5 6 7 8 |
class HelloRuby def hello puts "こんにちは" end end aisatu = HelloRuby.new aisatu.hello |
こんにちは
無事「こんにちは」と表示されましたね。まず1行目のclass文で新しく「HelloRuby」というクラスを定義しています。
クラス名は必ず大文字から始める決まりになっています
クラスとメソッドを作成すれば「new」メソッドを使って「HelloRuby」クラスのオブジェクト(インスタンス)を作成します。オブジェクトが作成できれば、後は「オブジェクト名.メソッド名」と書いて上げれば処理を行うことができるようになります。
Contents
newメソッドでオブジェクトを作成すると?
newメソッドを使ってクラスのオブジェクトを作成すると自動的に「initializeメソッド」が呼ばれています。「newメソッド」から渡した引数は「initializeメソッド」へと渡されることになります。
今回はnewメソッドを使ってオブジェクトを定義した際に「こんばんは」という文字列を「initializeメソッド」に渡してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
class HelloRuby def initialize(evening) puts evening end def hello puts "こんにちは" end end aisatu = HelloRuby.new("こんばんは") aisatu.hello |
こんばんは こんにちは
今回もさっきと同じように「HelloRuby.new」と記述し「HelloRuby」クラスから新しいオブジェクト「aisatu」を作成しました。今回はnewメソッドの後ろに引数を記述しています。この「new(“こんばんは”)」の引数「”こんばんは”」が「initialize(evening)」の「evening」に代入されることになります。「evening」に代入された文字列「”こんばんは”」はinitializeメソッドの処理でputsされています。
結果的にinitializeメソッドから「”こんばんは”」と、helloメソッドから「”こんにちは”」と出力が行われることになります。
インスタンス変数
通常の場合、「def~end」内で定義したメソッドで使われている変数は他のメソッドへと渡すことができません。しかし、「@変数」と記述し、インスタンス変数を作れば同じインスタンス(オブジェクト)内で情報を共有することができるようになります。
1 2 3 4 5 6 7 8 9 10 11 12 |
class HelloRuby def initialize(evening) @goodevening = evening end def hello puts "こんにちは#{@goodevening}" end end aisatu = HelloRuby.new("こんばんは") aisatu.hello |
こんにちはこんばんは
今回は「evening」に渡した文字列「”こんばんは”」を「@goodevening」というインスタンス変数に代入しています。インスタンス変数「@goodevening」は「hello」メソッド内でも使うことができるので今回の場合は「こんにちはこんばんは」と文字列が出力されています。
また、インスタンス変数はインスタンス(オブジェクト)ごとに値を保持することができるので下のように複数オブジェクトを作った場合、「@goodevening」メソッドは異なるそれぞれの値を持つことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class HelloRuby def initialize(evening) @goodevening = evening end def hello puts "こんにちは#{@goodevening}" end end aisatu = HelloRuby.new("こんばんは") aisatu2 = HelloRuby.new("おはよう") aisatu3 = HelloRuby.new("へろー") aisatu.hello aisatu2.hello aisatu3.hello |
こんにちはこんばんは こんにちはおはよう こんにちはへろー
【補足】helloメソッドに引数をつけてみる
ここまでやってくれば大体分かるとは思いますが、上記で作成していた「helloメソッド」にも引数を渡すことができます。
1 2 3 4 5 6 7 8 9 10 11 12 |
class HelloRuby def initialize(evening) @goodevening = evening end def hello(name) puts "こんにちは#{@goodevening}#{name}" end end aisatu = HelloRuby.new("こんばんは") aisatu.hello("やぎちゃん") |
こんにちはこんばんはやぎちゃん
6行目にて「def メソッド名(引数)」と記述を行いメソッド名と引数を定義しておきます。そして12行目で「オブジェクト.メソッド(引数)」と記述して引数を渡し、処理を行っています。
結果的に下記の3つの文字列が結合して出力されることになります。
- 「こんにちは」
- newメソッドからinitializeメソッドへと渡され、インスタンス変数となった「”こんばんは”」
- helloメソッドの引数「”やぎちゃん”」
インスタンス変数の情報にアクセスしたい場合
インスタンス変数の情報を参照したり、書き換えたりする場合は次のような記述を行えばOKです。まずはインスタンス変数の情報を参照してみましょう。
インスタンス変数の参照方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class HelloRuby def initialize(evening) @goodevening = evening end def reference @goodevening end def hello puts "こんにちは#{@goodevening}" end end aisatu = HelloRuby.new("こんばんは") puts aisatu.reference |
こんばんは
今回の場合、「reference」というメソッドを作り、そのメソッド内にインスタンス変数「@goodevening」を記述し、これを戻り値としています。そうすることで「aisatu.reference」とメソッドを呼び出せば、インスタンス変数の値が返ってくるので「@goodevening」の値を参照することができるようになります。
attr_readerメソッド
また、Rubyではこのようなめんどくさい記述を行わなくても下記のように「attr_reader :参照したいインスタンス変数名」と記述すれば自動的に同名の参照メソッドを作ってくれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class HelloRuby attr_reader :goodevening def initialize(evening) @goodevening = evening end def hello puts "こんにちは#{@goodevening}" end end aisatu = HelloRuby.new("こんばんは") puts aisatu.goodevening |
こんばんは
今回はインスタンス変数「@goodevening」の値を参照したいので「attr_reader :goodevening」と入れてみました。そうすることでインスタンス変数と同名の「goodevening」という名前の参照メソッドが作られることになります。
メソッドの定義が行われたので「aisatu.goodevening」でメソッドを呼び出してあげればインスタンス変数「@goodevening」の値を参照することが可能となります。
インスタンス変数の値を変更
次はインスタンス変数の値の変更方法をみていきましょう。インスタンス変数の値を変更するには下記のような記述を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class HelloRuby def initialize(evening) @goodevening = evening end def change(newname) @goodevening = newname end def hello puts "こんにちは#{@goodevening}" end end aisatu = HelloRuby.new("こんばんは") aisatu.hello aisatu.change("おはよう") aisatu.hello |
こんにちはこんばんは こんにちはおはよう
このように記述を行えば「@goodevening」の値を変更することができるようになります。具体的にはまず、6~8行目で引数から与えられた「newname」をインスタンス変数「@goodevening」に代入するように記述をおこないます。そして、17行目で「change」メソッドに「”おはよう”」という引数を渡しているのでその文字列がそのまま「@goodevening」に代入されてインスタンス変数の値を書き換えています。
attr_writerメソッド
また、インスタンス変数を書き換えるときも「attr_writer」というメソッド使えば簡単に書き換えメソッドを定義することができます。具体的には「attr_writer :書き換えたいインスタンス変数名」と記述を行うとそれと同名の書き換え専用メソッドを自動的に作ってくれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class HelloRuby attr_writer :goodevening def initialize(evening) @goodevening = evening end def hello puts "こんにちは#{@goodevening}" end end aisatu = HelloRuby.new("こんばんは") aisatu.hello aisatu.goodevening = "おはよう" aisatu.hello |
こんにちはこんばんは こんにちはおはよう
今回は2行目に「attr_writer :goodevening」と記述したのでインスタンス変数「@goodevening」の値を変更するためのメソッド「goodevening」が自動的に作られています。
そこで15行目の記述のようにgoodeveningメソッドを呼び出して値を代入してあげれば「”おはよう”」という文字列にインスタンス変数「@goodevening」の値が書き換えられることになります。
attr_accessorメソッド
attr_accessorメソッドを記述すれば、インスタンス変数の値の参照と変更のメソッドを同時に定義することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class HelloRuby attr_accessor :goodevening def initialize(evening) @goodevening = evening end def hello puts "こんにちは#{@goodevening}" end end aisatu = HelloRuby.new("こんばんは") aisatu.hello puts aisatu.goodevening # 値を参照 aisatu.goodevening = "おはよう" # 値を書き換える aisatu.hello |
こんにちはこんばんは こんばんは こんにちはおはよう
値の参照と変更は「attr_reader」「attr_writer」メソッドのときと同じ記述方法でOKです。
コメントを残す