お詫び
まず初めに、この記事はまだ私の理解が不足している可能性があり、誤っている情報があるかもしれません。私自身の備忘録として取り敢えず書いていますので、その点をご了承いただければ幸いです。
まず初めに、この記事はまだ私の理解が不足している可能性があり、誤っている情報があるかもしれません。私自身の備忘録として取り敢えず書いていますので、その点をご了承いただければ幸いです。
メソッド内に「self」と記述するとそのメソッドを受け取っているインスタンス(レシーバ)のことを指すことになります。例えば下記のようなスクリプトがあったとします。
1 2 3 4 5 6 7 8 9 |
class ReceiverReference def selfTest puts "↓にselfTestのレシーバを示します" puts self end end receiver = ReceiverReference.new receiver.selfTest |
下にselfTestのレシーバを示します #<ReceiverReference:0x00000000a13308>
このように記述するとクラス「ReceiverReference」のオブジェクト(インスタンス)がputsされることになります。
今のところオブジェクトは「receiver」しか作成していないので「#<ReceiverReference:0x00000000a13308>」と表示されているなぞの値はオブジェクトである「receiver」ということになります。
このなぞの値の特定方法が、このような消去法みたいな感じになってしまって本当にすみません。。値の特定方法が分かる方、コメントとかからメッセージを頂ければ泣いて喜びます。
selfを使って他のインスタンスメソッドを呼び出す
メソッド内で「self」を使うとその「self」はそのメソッドのレシーバになっているというところまでは分かりました。
間違っていると思いますがイメージ的には↓のような感じかと。汗
「self = レシーバ」 つまり今回の場合は⇒ 「self = receiver」
「self = レシーバ」 つまり今回の場合は⇒ 「self = receiver」
それでは「self」を使って他のインスタンスメソッドを呼び出してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
class ReceiverReference def test return "testメソッドが呼び出されました" end def selfTest puts self.test end end receiver = ReceiverReference.new receiver.selfTest |
testメソッドが呼び出されました
12行目でのreceiver.selfTestの処理としては下記の通りです。
- 12行目にて「selfTest」メソッドが呼び出される。
- 6行目の「def selfTest」で定義したメソッド処理内容は「self.test」を呼び出してその値を「puts」する
- 「self.test」の「self」はレシーバを指すので結果的に「receiver.test」のような感じになる
- 「test」メソッドが「selfTest」メソッド内で呼び出される
- 「test」メソッドが文字列を返す
- 「selfTest」メソッドにてその文字列が「puts」される
- 結果、「”testメソッドが呼び出されました”」という文字列が出力される
また、下記のように「self」を省略して他のインスタンスメソッドを呼び出すこともできます。「self」の記述がない場合レシーバは示されていないように見えますが、メソッドのみ呼び出した際に自動的に「self」を追加しレシーバを参照しているようです。
1 2 3 4 5 6 7 8 9 10 11 12 |
class ReceiverReference def test return "testメソッドが呼び出されました" end def selfTest puts test end end receiver = ReceiverReference.new receiver.selfTest |
testメソッドが呼び出されました