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

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

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

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

Q&A

解決済

2回答

1631閲覧

Classのインスタンスメソッドinherited()は、何らかのメソッド一覧取得で得られる配列の要素なのでしょうか?

jun68ykt

総合スコア9058

Ruby

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

0グッド

2クリップ

投稿2014/09/22 08:28

こんにちは。前回の質問ではお世話になりました。
前回同様に、メタプログラミングRuby を読んでいて疑問に思ったことの質問です。

以下は、同著P.201 「5.7 フックメソッド」からの引用です。

lang

1以下のプログラムはクラスがStringを継承したときに画面にその通知を印字するものだ。 2 3 class String 4 def self.inherited(subclass) 5 puts "#{self}は#{subclass}に継承された" 6 end 7 end 8 9 class MyString < String; end 10 11⇒ StringはMyStringに継承された 12 13 inherited()メソッドはClassのインスタンスメソッドで、クラスが継承されたとき 14にRubyが呼び出してくれる。デフォルトのClass#inherited()は何もしない。

疑問は、上記の説明文中の

lang

1inherited()メソッドはClassのインスタンスメソッドで、

の部分です。
説明にあるとおり、inherited()メソッドがClassのインスタンスメソッドであるならば、

lang

1Class.instance_methods

で得られる配列の中に要素として、シンボル :inherited があるのだろうなと思いまして、
以下を実行して、irbから確かめてみました。

lang

1[vagrant@vagrant-centos65 ~]$ ruby -v 2ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux] 3[vagrant@vagrant-centos65 ~]$ irb 4Welcome to IRB. You are using ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]. Have fun ;) 5irb(main):001:0> Class.instance_methods.grep /inherited/ #=> []

上記の最後の行のように、Class.instance_methods.grep /inherited/ が空の配列を返しており、
Class.instance_methods の中に、:inherited が無いことが分かりました。

そこで質問なのですが、inherited メソッドは、何らかのクラスに対する、何らかのメソッド一覧
取得メソッドで得られる配列の中には、現われてくるものなのでしょうか?

もしくは、私が
「inherited()メソッドがClassのインスタンスメソッドであるならば、Class.instance_methodsで
得られる配列の中にinheritedがあるだろう」
と考えたことが間違いなのでしょうか?

よろしくご教示ください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

レシーバーを指定して明示的に呼び出すメソッドではないので、privateになってるようです。

lang

1$ ruby -e 'p Class.private_instance_methods(false)' 2[:inherited, :initialize]

「inherited()メソッドがClassのインスタンスメソッドであるならば、Class.instance_methodsで得られる配列の中にinheritedがあるだろう」
と考えたことが間違いなのでしょうか?

については、間違いです。下記参照。
Rubyリファレンスより:

instance_methods(inherited_too = true) -> [Symbol]
そのモジュールで定義されている public および protected メソッド名の一覧を配列で返します。

private_instance_methods(inherited_too = true) -> [Symbol]
そのモジュールで定義されている private メソッド名の一覧を配列で返します。

投稿2014/09/22 09:23

otn

総合スコア84529

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

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

jun68ykt

2014/09/22 22:58

ありがとうございました。 (1) instance_methodsはprivateメソッドを返さない。 (2) privateメソッドを確認するには、private_instance_methods を使う。 この2点、よく覚えておきます。
guest

0

Rubyのマニュアルによれば、

新しく生成されたサブクラスを引数にインタプリタから呼び出されます。

とあるように、「名前は決まっているけどクラス一般に必要なものではないから、標準では何もない」ということではないでしょうか。

投稿2014/09/22 08:58

maisumakun

総合スコア145183

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

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

jun68ykt

2014/09/22 23:04

ありがとうございました。マニュアルをちゃんと読んで >新しく生成されたサブクラスを引数にインタプリタから呼び出されます。 の一文から、「これはprivateメソッドだろうな」と推測できるほどには、 まだ自分はrubyに習熟していないことを感じました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問