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の構造体とほとんど関係がないので、混乱しないようにしましょう。
関連
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] Rubyで配列に値が存在するかどうかを確認する方法
-
[解決済み] C++でクラスと構造体はいつ使い分けるべきか?
-
[解決済み] C++の'struct'と'typedef struct'の違い?
-
[解決済み] Ruby/RailsでHashからキーを削除して残りのHashを取得する方法は?
-
[解決済み] C言語標準に準拠した構造体の初期化方法
-
[解決済み】PHPパスワードのハッシュとソルトの安全性について
-
[解決済み】ハッシュに新しい項目を追加する方法
-
[解決済み] Rubyで文字列が正規表現にマッチするかどうかをチェックする最も速い方法?
-
[解決済み] インスタンス変数の値をその名前で取得する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] rvm use 2.0.0 --default を実行すると、"Warning! PATH is not properly set up" と表示される。
-
[解決済み] Rubyで本当に安いコマンドラインオプションのパース
-
[解決済み] 文字列を DateTime に変換する
-
[解決済み] Rubyでオブジェクトのキーを配列として取得する
-
[解決済み] 変数名を使ったRubyの正規表現
-
[解決済み] ローカルファイルやURLからIOストリームをオープンする
-
[解決済み] Rubyで2つの配列のマージとインターリーブ
-
[解決済み] Rubyで再帰的にディレクトリを作成するには?
-
[解決済み] クラスのインスタンスメソッドの一覧を取得する
-
[解決済み] Mavericks と Xcode 5.1 で Ruby Gem install Json が失敗する - unknown argument: '-multiply_definedsuppress'.