Rubyでは構造体風の振る舞いをするStructクラスがあるのは有名な話。タプル的なものを使わなければいけない際、Hashだと hoge[:name] = "hoge" のように書かなければいけないところを、 hoge.name = "hoge" と書けてタイプ数が減り、便利。

リファレンスマニュアルには以下のような形で、新しい構造体クラスを作る、とある。

1
HogeTuple = Struct.new(:name, :value)

でも、僕はこう書かないと落ち着かない……。

1
2
class HogeTuple < Struct.new(:name, :value)
end

2行(あるいは「;」を含む記法)になってしまうし、何より無名のサブクラスが一つ余計に生成されてしまう(実際、 HogeTuple.ancestors で分かる)ので富豪的な感じがあるが、でも class って宣言が無いと非常にそわそわするんだけど、、、こう書くの僕だけ?

あと、HogeTupleにさらに独自のメソッドを付け加えたい際は、下の書き方のほうがコードがすっきりする、と言うメリットもある(と、最初は考えてた)。

でも

上記記事では、

1
2
3
4
5
class HogeTuple < Struct.new(:name, :value)
  def inspect
    "<#{self.class} name: #{self.name.inspect} value: #{self.value.inspect}>"
  end
end

みたいなのはobsoleteであると主張していて、Struct.newにブロックを伴う書き方がいいようだ。

1
2
3
4
5
HogeTuple = Struct.new(:name, :value) do
  def inspect
    "<#{self.class} name: #{self.name.inspect} value: #{self.value.inspect}>"
  end
end

何が言いたいかというと、「俺もそわそわする!」 と言う方は一緒に流行らせましょう。ということでこの行削除。ここまでは言えない。。

確かにancestorsに無名の謎クラスが入ってしまうのも気持ち悪い感じはある。でも、僕はclass って書いてないとそわそわする。もはや好みの問題?

あと

「StructをどうしてもStrutsと綴ってしまう」と言うコミュニティを作りましょう。Javaほとんど書けない僕ですらこうなのだから、みんなきっと間違えるだろうと思う(勘違い)。