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

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

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

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

Q&A

解決済

1回答

905閲覧

undefによってメソッドが使えなくなる範囲について

ShinjiAsai

総合スコア51

Ruby

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

1グッド

1クリップ

投稿2020/06/17 04:51

お世話になります。Ruby技術者認定試験合格教本Goldの問題において理解できない部分があったので質問します。

###問題のコード

Ruby

1module Mod 2 def foo 3 puts "Mod" 4 end 5end 6 7class Cls1 8 def foo 9 puts "Cls1" 10 end 11end 12 13class Cls2 < Cls1 14 include Mod 15 undef foo 16end 17 18Cls2.new.foo #=> 例外発生 19 20#Cls1クラスで定義されたfooは、Cls2クラスでundefにより定義が取り消されているため。

###わからなかった点

undef fooによってCls1のインスタンスメソッドfooが取り消されているのは理解できました。しかしCls2Module Modincludeされており、その中にもfooメソッドがあります。

**この場合、module Modfooメソッドもundef fooの影響を受けていると考えていいのでしょうか?**言い換えますとmoduleのfooメソッドも参照できなくなっているかどうかが理解できませんでした。

その点について問題集の解説から読み取れなかったので、教えていただけたら幸いです。よろしくお願いします。

anmoanmo👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

るりまに書かれているとおりです。

undef のより正確な動作は、メソッド名とメソッド定義との関係を取り除き、そのメソッド名を特殊な定義と関連づけます。この状態のメソッドの呼び出しは例えスーパークラスに同名のメソッドがあっても例外 NameError を発生させます。(るりまより)

投稿2020/06/17 04:57

maisumakun

総合スコア145183

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

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

maisumakun

2020/06/17 04:58

「undef」という名前ですが、「呼ぶとNameErrorになるようにメソッドを定義する」と考えたほうが適切です。
maisumakun

2020/06/17 04:59

…というより、前から「るりまを確認すればすぐ解決する」質問が多数を占めているのですが、自分で確認したりはされないのでしょうか?
ShinjiAsai

2020/06/17 05:33

ご回答いただきありがとうございます。解決しました。 今までのものも、自分なりに15分調べて理解できなかったものを質問させていただいております。というのも今までにも何度か「調べればすぐわかる」というようなご指摘をいただいたことがあったからです。 今のレベルの問題だと調べても理解できないことが多い印象を持っています。それゆえ質問が多くなってしまって申し訳ありません。 今以上にできるだけ自分で解決できるように努力しますが、わからないものはこういった場所をかりて解決させていただきたいと思っている次第です。 いつも私にはない視点から回答をいただき、感謝しております。ありがとうございます。
otn

2020/06/17 13:39

「るりまに書かれているとおりです」という回答で解決した言うことは、るりまを読んで分かったということでは? であれば、最初からるりまを読めば良いという指摘だと思います。 もしかして、「るりまの記述を読んでも理解できないが、回答をもらったので、解決したことにした」ということなのでしょうか?
ShinjiAsai

2020/06/18 00:33

そうですね。今回の件について解決に至るまでの状況です。 まず質問の前にるりまの記事もみていました。またそのほかundef関連記事を読んでundefの挙動を調べていました。 しかし私の実力が不足しており今回のundefの挙動を説明する部分を重要視できなかったため、質問の件に関連するmodule内部でのメソッドの記述はなかったように受け取ってしまっていました。 また調べるのに時間もかかってしまっていたので、この部分の挙動については聞いてしまった方が速いと思って質問させていただきました。 その結果maisumakun様からご返信いただき、るりまの該当部分を再度注意して読んだ結果、問題解決のためには、るりまのこの部分の記述が重要なのだと気付かされました。 その後、質問の件についてirbにてmoduleからfooメソッドが呼び出せるかどうかを確認したところ、fooメソッドが呼び出せないと言うことがわかりました。 ですので、その後に今回の件については理解できたと思ったので、解決しましたと返信した次第です。 確かに今回このようなご指摘をいただき再度考えてみると、今回の件についても今までの件についても、自力で解決できなかったかどうかと言われると、解決できた部分はあったなと思って反省しております。 また調べ方についても、回答いただいた部分について事前に調べていることもあったので、事前に調べて読んでいるにもかかわらず、それを解決に繋げられなかったことについては改善の余地があると思っています。 >>もしかして、「るりまの記述を読んでも理解できないが、回答をもらったので、解決したことにした」ということなのでしょうか? そう言うわけではありません。
unknown123

2021/12/08 14:04

@maisumakun →質問者は調べても解決しなかったから質問している。るりま見ればわかるっしょみたいな冷たい回答多すぎ。見てるこっちが腹立つ。 @otn →エンジニアっぽい無駄な再確認。わざわざ質問してるんだから解決出来なかったと検討がつく。
maisumakun

2021/12/14 09:57

> 質問者は調べても解決しなかったから質問している 残念ながら、そうともいえないのがここで回答していての実感です。
otn

2021/12/14 14:41

> わざわざ質問してるんだから解決出来なかったと検討がつく。 これは私のコメントと関係ないのでは? 私がコメントしたのは、 ケース1: ・るりまを読んでなかったが、回答をもらいるりまを読んで理解して、解決した ⇒ じゃあ、最初からちゃんと見てれば質問するまでもなかった。ちゃんと見よう ケース2: ・質問前からるりまは読んでいたが、理解できなかったので質問した ⇒なのに「るりまを見ればわかる」という回答で解決??どういうこと?? という2パターンしか想定しなかったからです。実際は、 ケース3: ・質問前からるりまは読んでいたが、理解できなかったので質問した。が、回答もらって読み直したら理解できた という私の想定出来なかったパターンですね。これに対しては、1回読んでわからないものを、内容についてのアドバイス無しに2回読んで理解できるというのは期待できないので、「るりまなどちゃんとしたドキュメントを理解できるまで何度も読めば良かった。今度からそうしよう」とはアドバイスしにくいので、何もコメントしませんでした。
otn

2021/12/14 14:46

> 質問者は調べても解決しなかったから質問している。るりま見ればわかるっしょみたいな冷たい回答多すぎ。 今の若者の「調べた」は、「ググってヒットした先頭のいくつかの記事(個人ブログだったり、怪しげな学習サイトだったり)を読んだ」だったりすることが多そうなので、どうやって調べたか書いてない場合は、「ちゃんとしたドキュメントを見ましょう」というアドバイスは意味があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問