【Ruby】メソッド内のselfについて

ABOUTこの記事をかいた人

気になること&知らないことをひたすらググることを得意としています。このブログでは最近気になったことを中心に記事を書いていきます。記事には間違った情報を書かないように細心の注意を払っていますが、もし誤りがあった場合はコメントやお問い合わせフォームからご指摘いただければ幸いです。
お詫び
まず初めに、この記事はまだ私の理解が不足している可能性があり、誤っている情報があるかもしれません。私自身の備忘録として取り敢えず書いていますので、その点をご了承いただければ幸いです。

メソッド内に「self」と記述するとそのメソッドを受け取っているインスタンス(レシーバ)のことを指すことになります。例えば下記のようなスクリプトがあったとします。

下にselfTestのレシーバを示します
#<ReceiverReference:0x00000000a13308>

このように記述するとクラス「ReceiverReference」のオブジェクト(インスタンス)がputsされることになります。

今のところオブジェクトは「receiver」しか作成していないので「#<ReceiverReference:0x00000000a13308>」と表示されているなぞの値はオブジェクトである「receiver」ということになります。

やぎちゃん
このなぞの値の特定方法が、このような消去法みたいな感じになってしまって本当にすみません。。値の特定方法が分かる方、コメントとかからメッセージを頂ければ泣いて喜びます。

selfを使って他のインスタンスメソッドを呼び出す

メソッド内で「self」を使うとその「self」はそのメソッドのレシーバになっているというところまでは分かりました。

間違っていると思いますがイメージ的には↓のような感じかと。汗
「self = レシーバ」 つまり今回の場合は⇒ 「self = receiver」

それでは「self」を使って他のインスタンスメソッドを呼び出してみましょう。

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」を追加しレシーバを参照しているようです。

testメソッドが呼び出されました

コメントを残す

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

ABOUTこの記事をかいた人

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