質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

1826閲覧

楽しいRubyに関する質問

cheeeeeeese

総合スコア179

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2015/09/02 03:58

皆様、質問がございます、宜しくお願い申し上げます。

質問 下記のHelloWorldクラスにて、greetメソッド(インスタンスメソッド)とtest_nameメソッド(インスタンスメソッド)があります。この時、「puts "Hi, I am #{self.name}"」の「#{self.name}」は何の機能の為に存在しているのかが理解できないため、質問致します。
注釈 楽しいRubyでは、下記ののCodeをインスタンスメソッドの中でメソッドのレシーバ自身を参照するための特別な変数として紹介しています。 つまり、メソッドのレシーバ自身を参照(値の記憶先の指定を)するために"self"を使うと紹介しています。
class HelloWorld attr_accessor :name def greet puts "Hi, I am #{self.name}" end def test_name self.name = "ruby" end end hello = HelloWorld.new hello.greet #出力結果 #=> Hi, I am

失礼致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

インスタンスとはクラスから生み出したオブジェクトのこと。下のコードだと「Jun」や「Mike」
インスタンスメソッドとはインスタンスの参照から呼び出されるメソッドのこと
レシーバとは参照元のオブジェクトのこと。「Jun.greet」なら「Jun」がレシーバ
言いたかったのはselfを使えばレシーバのメンバにアクセスできるってことだと思います。
※書かれたコードでは「hello.test_name」が実行されていないので、「name」が空のままです。

Ruby

1class HelloWorld 2 attr_accessor :name 3 4 def greet 5 puts "Hi, My name is #{self.name}" 6 end 7 8 def my_name(str) 9 self.name = str 10 end 11end 12 13Jun = HelloWorld.new 14Jun.my_name("Jun") 15Mike = HelloWorld.new 16Mike.my_name("Mike") 17 18puts Mike.name 19 #出力結果 => Mike 20Mike.greet 21 #出力結果 => Hi, My name is Mike 22Jun.greet 23 #出力結果 => Hi, My name is Jun

投稿2015/09/02 05:42

編集2015/09/02 05:54
hirohiro

総合スコア2068

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cheeeeeeese

2015/09/02 07:23

ありがとうございます。 つまり、メンバ=変数の "引数""という認識でよろしいでしょうか。 再度質問させていただきます。 失礼致します。
hirohiro

2015/09/02 07:51

引数とは一般に関数に与えるパラメータのことかと思いますので少しニュアンスが異なるかも知れません。 一人称に当たるものと理解すれば概ね間違いないかと思います。 他の言語だとthisなんかが似たような役割をします。 オブジェクト指向は物(オブジェクト)を中心にロジックを組むので、一人称が無いと不便です。 「貴方のお名前は?」と聞かれたときに「私の名前はxxです。」と答える(私)の部分がselfです。self.nameのnameは「私」のメンバです。 selfが無いと例えば「貴方の苗字は?」と聞かれた際に「Junの苗字はSmithです」といった回答になってしまいます。 classはオブジェクトの設計図で、同じクラスを使って複数のインスタンスを作成可能です。junとmikeは同じクラスのインスタンスです。 同じクラスから作成されても、メンバの値は異なりますのでclass内で定義したメソッドにあらかじめjunの名前を回答するメソッド、mikeの名前を回答するメソッドと準備しておくわけにもいきませんし、Mike.greet(Mike)とするのも間抜けな話です。 ただ内部的にはこれと同じような事が成されて、それをselfで受けているのかも知れませんね。設計仕様のほうは見てないので私は知らないですけども。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問