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

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

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

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

Q&A

解決済

1回答

1492閲覧

Rubyのメソッドにおけるself.の必要性

Sigma1630

総合スコア36

Ruby

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

0グッド

0クリップ

投稿2019/01/24 16:12

以下のコードはどちらも同じ結果を返します。

Ruby

1class Human 2 attr_accessor :name 3 4 def introduce 5 return "私の名前は#{name}です" 6 end 7end 8 9taro=Human.new 10taro.name="太郎" 11 12puts taro.introduce

Ruby

1class Human 2 attr_accessor :name 3 4 def introduce 5 return "私の名前は#{self.name}です" #self.を追加 6 end 7end 8 9taro=Human.new 10taro.name="太郎" 11 12puts taro.introduce

なんとなく下の書き方の方が好ましい雰囲気を感じます、上はProgateの採点で怒られました。
しかし出力が同じなので両者で何が違うのかはよくわかってません。

【聞きたいこと】
self.を付ける理由はなんですか?
上のコードのような書き方をすると何か不都合・弊害が生じますか?

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

attr_accessor :nameがあるので、nameはメソッドですが、レシーバーのselfは、メソッド名がメソッドであることが明らかな場合は省略できます。

selfの明示が必要なのは、
・英大文字で始まるメソッド
・同名のローカル変数がある場合
などでメソッド呼び出しの括弧が無い場合です。これらは、普通はそう書かないですよね。
あと、
name=の形のメソッドの場合
この場合は、同名のローカル変数への代入とみなされます。

(他にもあるかも)

省略できるときには省略するのが普通だと思います。

投稿2019/01/24 16:39

otn

総合スコア84538

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

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

Sigma1630

2019/01/25 03:42

ぼやっと分かりました。変数と区別がつかない形でメソッドを定義できてしまうのは不思議な仕様ですね。pythonみたいにname()みたいに書ければ区別しやすいのですが。 ありがとうございます。
kts_h

2019/01/25 03:54

otn さんも指摘されているように、Ruby でも、name() とできます。ただ、() がなくても、メソッドの呼び出しと分かる場合にはつけませんし、明示的に、局所変数ではなくメソッドだと分かるようにするにしても、Ruby の場合、name() よりも self.name とする方が一般的なように思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問