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のインスタンスなのね.組み込みのでこういうのがあるとは知らなかった.