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

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

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

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

Q&A

解決済

2回答

392閲覧

Ruby のクラスの継承を辿ったときのメソッドの実行順序がわかりません

tuvalu

総合スコア136

Ruby

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

0グッド

0クリップ

投稿2017/07/26 01:21

編集2017/07/26 01:36

いつもおかしな質問ばかりですみません。
いまRubyの試験を受けようと独学していますが、
クラスの継承を辿ったときのメソッドの実行順序がわかりません。
なぜ、そうなるのかもわかりません。お分かりの方、ご教授頂ければ喜びます。

Ruby技術者認定試験 合格教本というテキストがありまして、その本の基礎力確認問題というのがあります。
Goldの問題14オブジェクト指向です。

以下のコードを実行するとどうなりますか。
module Mod
def foo
puts "Mod"
end
end
class Cls1
include Mod
def foo
puts "Cls1"
super
end
end
class Cls2 < Cls1
def foo
puts "Cls2"
super
end
end

Cls2.new.foo

正解はわかりました。
Cls2
Cls1
Mod

合っていました。ところが試験ではこんな易しい問題はでません。少しいじるだけでわからなくなってしまいます。

以下のコードを実行するとどうなりますか。
module Mod
def foo
puts "Mod"
end
end
class Cls1
include Mod
def foo
super
puts "Cls1"
end
end
class Cls2 < Cls1
def foo
super
puts "Cls2"
end
end

Cls2.new.foo

まだまだ、レベルが低いため、こうなるだけでわからなくなってしまいます。
Cls2のfooを実行すると、最初にsuperがきているので、そのsuperを実行して
Cls1のfooに移り、またまた先にsuperがきているので、そのsuperを実行して
Modのfooに移り、その先はないので、そのfooを実行して、おしまい。ってことで
答えは、Mod(のみ)と考えました。

ところが、実際に実行してみると、
Mod
Cls1
Cls2

と、クラスのfooも実行されている上に、おまけにCls1、Cls2、と降りてきている。。
ああ、これがわからんようじゃあ、試験は受からんわと思いながら、なぜそう動くのかの説明を
探しても見つけることができずに消沈しております。
どなたか、わかる方いらしたら、もしくは、ここ見たら書いてあるよみたいなことでも
お教え願えないでしょうか?よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

superを実行したら、そのsuperの次の行を実行します。

投稿2017/07/26 01:31

otn

総合スコア84505

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

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

tuvalu

2017/07/26 03:46

ご回答ありがとうございます。
guest

0

ベストアンサー

Cls2.new.fooを実行すると…

  1. Cls2#fooが呼ばれるので,Cls2#fooに処理が移り,(1)が実行されます.
  2. (1)はCls1#fooを呼ぶので,Cls1#fooに処理が移り,(2)が実行されます.
  3. (2)はMod#fooを呼ぶので,Mod#fooに処理が移り,(3)が実行されて"Mod"が表示されます.
  4. (3)を実行した後,Mod#fooを呼び出したCls1#fooに処理が戻り,(2)は実行済みなので次の行である(4)が実行されて"Cls1"が表示されます.
  5. (4)を実行した後,Cls1#fooを呼び出したCls2#fooに処理が戻り,(1)は実行済みなので次の行である(5)が実行されて"Cls2"が表示されます.

ruby

1module Mod 2 def foo 3 puts "Mod" # (3) 4 end 5end 6 7class Cls1 8 9 include Mod 10 11 def foo 12 super # (2) 13 puts "Cls1" # (4) 14 end 15 16end 17 18class Cls2 < Cls1 19 20 def foo 21 super # (1) 22 puts "Cls2" # (5) 23 end 24 25end

投稿2017/07/26 02:03

tamy

総合スコア442

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

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

tuvalu

2017/07/26 03:44

ご回答ありがとうございます。 う〜む。モジュールまで行って、行きつくとまで行って処理したら、はい、おしまい、ではないんですね。。 戻りながら、実行してない処理があれば、処理をしながら戻ってくるんですね!? う〜む、むむむ。。何度も実行して身体で覚えます。ありがとうございます。
tuvalu

2017/07/26 03:45

ちなみに、このような動きが解説されている書籍なりテキストってありますか? よろしくお願いします。
tamy

2017/07/26 06:06

最近の書籍は追いかけてないので少し情報が古いかもですが,試験対策なら「Ruby 公式資格教科書」がやはりいいかと.個人的には「メタプログラミング Ruby」も良書だとは思います(私はほぼこれでRubyを勉強したので)が,基礎的な部分がわかっていないと少し難しいかもしれません.
tuvalu

2017/07/26 07:16

両方とも持っていますので、もう一回読みますね! プログラミング自体、いちからのスタートなので、わからないことだらけなんです。。^^ 回りに教えてくれる人は一人もいません。。孤独な戦いです。 先週gold落ちたばかりで。。 このたびは、いろいろと教えて頂きたいへんありがとうございます。 助かりました。また機会があればよろしくお願い致します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問