Struct#membersが文字列の配列を返すのはどうなの?
Hoge = Struct.new(:foo, :bar, :baz) p Hoge.members # => ["foo", "bar", "baz"]
Struct.newに渡したのはシンボルなのに,Struct#membersで文字列の配列が返ってくる.ここはシンボルの配列が返ってきて欲しいものじゃないのかなぁ?こういう時こそシンボルを使う所じゃないの?
これって要は,Struct.newで渡したシンボルを態々文字列に変換してるんだよね.Object#sendに渡すのとかは(追記:文字列も渡せるけど)シンボルだから,また戻さなきゃいけない.嫌だなぁ.
考えてみればObject#methodsとかもそう.
直接シンボルの配列を得る方法は無いのかしら?
ぱっと思い浮かぶ解決策は3つ.
(イ)諦める
# Symbol#to_procの定義は省略 Hoge = Struct.new(:foo, :bar, :baz) p Hoge.members.map(&:to_sym) # => [:foo, :bar, :baz]
(ロ)Struct.newに渡す引数を保存
Hoge = Struct.new(*(hoge_members = :foo, :bar, :baz)) p hoge_members # => [:foo, :bar, :baz]
(ハ)Structをいじる or Structを継承していじる
class MyStruct < Struct def MyStruct.new(*args, &block) super(*args, &block).class_eval { @members = args def self.members @members end self } end end Hoge = MyStruct.new(:foo, :bar, :baz) p Hoge.members # => [:foo, :bar, :baz]
簡単のためにStruct.newの第一引数に文字列を渡すパターンは無視.
class_evalとか初めて使ったけどこれでいいのだろうか.
どれも酷いやり方な気がする.何とかならないかなぁ.
あと,これ書いてて気付いたけど,
Foo = Struct.new(:foo) p Foo.class # => Class p Foo.superclass # => Struct
Struct.newしたのにStructじゃなくてClassのインスタンスなのね.組み込みのでこういうのがあるとは知らなかった.