質問: Struct.new(:hoge, :piyo) do # 中身略 end ``` 「無名クラスが使用されなくなってしまうことがある」というのが、どんな状況でどんな問題になるのかよくわからないのですが、そのあたりについて教えていただけましたら幸いです。
回答: わたしが知っているのは、こんなコードぐらいかな。 ``` class SomeClass < Struct.new(:foo, :bar) # 中身略 end class SomeClass < Struct.new(:foo, :bar) # 中身略 end ``` 上の二つの`Struct.new(:foo, :bar)`は別のクラスとして作成されちゃうの。そこが重要な点。 Rubyはオープンクラスを採用しているから、同じ名前のクラス定義で中身を再定義出来るんだけど、その時は親クラスの指定を一致しておかなくちゃいけないの。そうしないと、TypeError例外で止まっちゃうんだ。代替手段として、再定義時は親クラスを指定しないって方法もあるけど、親クラスを書かない方が先に読み込まれちゃうと、これまた不一致でエラーだよ。世の中世知辛いね。 最初に言ったけど、親になっているのは別のクラスとして作成されている、つまり、親クラスが不一致と言うことで、上のコードもエラーになっちゃうんだよ。カスタマイズするための再定義だけじゃなくて、`load`で二回読み込んじゃった場合とかでも発生するよ。 こんなこと問題になることなんて無いよとか思ってない?全然そんなことないよ。実際寺尾君のライバルのところには相談があったんだから。 ruby - irbで2回以上loadすると失敗する - スタック・オーバーフロー `AnotherClass`も定数の再定義になるからダメじゃないかって?大丈夫。Rubyの定数は警告出すだけで上書き可能だから、何も問題が無いよ!