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

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

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

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

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Q&A

解決済

1回答

1577閲覧

無名クラスから継承すると、何が問題なのか(Ruby)

maisumakun

総合スコア145950

Ruby

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

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

2グッド

3クリップ

投稿2018/05/02 22:25

Rubyのクラスとして、プロパティを指定したクラスを簡単に作れるStructがあります。

そして、もちろんStructを拡張して自前のクラスに発展させていくこともできるのですが、るりまを見たところ、以下のような記述がありました。

Structをカスタマイズする場合はこの方法(注:Struct.newにブロックを付ける方法)が推奨されます。無名クラスのサブクラスを作成する方法でカスタマイズする場合は無名クラスが使用されなくなってしまうことがあるためです。

コードに起こせば、以下のようになるわけです。

ruby

1# おすすめでない方法 2class SomeClass < Struct.new(:foo, :bar) 3 # 中身略 4end 5 6# 推奨 7AnotherClass = Struct.new(:hoge, :piyo) do 8 # 中身略 9end

「無名クラスが使用されなくなってしまうことがある」というのが、どんな状況でどんな問題になるのかよくわからないのですが、そのあたりについて教えていただけましたら幸いです。

gouf, kazto👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

わたしが知っているのは、こんなコードぐらいかな。

Ruby

1class SomeClass < Struct.new(:foo, :bar) 2 # 中身略 3end 4 5class SomeClass < Struct.new(:foo, :bar) 6 # 中身略 7end

上の二つのStruct.new(:foo, :bar)は別のクラスとして作成されちゃうの。そこが重要な点。

Rubyはオープンクラスを採用しているから、同じ名前のクラス定義で中身を再定義出来るんだけど、その時は親クラスの指定を一致しておかなくちゃいけないの。そうしないと、TypeError例外で止まっちゃうんだ。代替手段として、再定義時は親クラスを指定しないって方法もあるけど、親クラスを書かない方が先に読み込まれちゃうと、これまた不一致でエラーだよ。世の中世知辛いね。

最初に言ったけど、親になっているのは別のクラスとして作成されている、つまり、親クラスが不一致と言うことで、上のコードもエラーになっちゃうんだよ。カスタマイズするための再定義だけじゃなくて、loadで二回読み込んじゃった場合とかでも発生するよ。

こんなこと問題になることなんて無いよとか思ってない?全然そんなことないよ。実際寺尾君のライバルのところには相談があったんだから。
ruby - irbで2回以上loadすると失敗する - スタック・オーバーフロー

AnotherClassも定数の再定義になるからダメじゃないかって?大丈夫。Rubyの定数は警告出すだけで上書き可能だから、何も問題が無いよ!

投稿2018/05/02 23:03

raccy

総合スコア21737

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

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

kawakawa2018

2018/05/02 23:30

はじめまして。参考になります。
maisumakun

2018/05/03 22:22

動的に生成すると、こういうことも起きますね。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問