1. ホーム
  2. ruby

RubyでHashの代わりにStructを使うのはどんなとき?

2023-09-07 14:43:23

質問

私はあまりプログラミングの経験がありません。しかし、私には、StructはHashに多少似ているように思えます。

  • Struct は何がうまくできるのでしょうか?
  • Structにできて、Hashにできないことはありますか?

ググってみると、C言語ではStructの概念が重要とのことですが、C言語はあまりよくわかりません。

どのように解決するのですか?

構造体は、ハッシュマップを使う場合と以下の点で異なります(コードの見え方に加えて)。

  • ハッシュに新しいキーを追加するのに対して、構造体は固定の属性セットを持ちます。
  • structのインスタンスに存在しない属性を呼び出すとNoMethodErrorが発生し、ハッシュから存在しないキーの値を取得するとnilが返されるだけです。
  • 異なる構造体の 2 つのインスタンスは、構造体が同じ属性を持ち、インスタンスが同じ値を持つ場合でも、決して等しくはなりません (すなわち Struct.new(:x).new(42) == Struct.new(:x).new(42) は偽であるのに対し Foo = Struct.new(:x); Foo.new(42)==Foo.new(42) は真)。
  • to_a メソッドは構造体のための値の配列を返し、一方 to_a はキーと値のペアの配列を返します (ここで "pair" は "two-element array" を意味します)。
  • もし Foo = Struct.new(:x, :y, :z) を行うことができます。 Foo.new(1,2,3) のインスタンスを作成します。 Foo のインスタンスを生成します。

では、質問にお答えします。既知の属性のセットを持つオブジェクトをモデル化したい場合は、構造体を使用します。例えば、文字列中に各単語が出現する頻度をカウントしたり、ニックネームとフルネームを対応付けたりすることは、間違いなく構造体の仕事ではありませんが、名前、年齢、住所を持つ人物をモデル化するには Person = Struct.new(name, age, address) ).

余談ですが、C言語の構造体はrubyの構造体とほとんど関係がないので、混乱しないようにしましょう。