Struct
Rubyにもstruct があるということを教えてもらったので、早速使ってみる。
Struct って?
いわゆる構造体。語弊はあるけれど、メソッドの無いクラスのようなものと理解している。
Rubyの場合、Struct.new でstruct型のサブクラスを作り、それをさらにnewすると構造体が生成される。
Struct.newで通常のclass定義を行い、その後にインスタンス作ってるような感じ。
1行で定義が書けてしまうのはいいなあ。
#!/usr/bin/env ruby #-*-coding:utf-8-*- hoge = Struct.new('Hoge', :foo, :bar, :baz) p hoge # >> Struct::Hoge baka = hoge.new('ほえほえ','はうはう', 'もげもげ') p [baka.foo, baka.bar, baka.baz] # >> ["ほえほえ", "はうはう", "もげもげ"] p baka # >> #<struct Struct::Hoge foo="ほえほえ", bar="はうはう", baz="もげもげ"> baka.each_pair do |k,v| p [k, v] end # >> [:foo, "ほえほえ"] # >> [:bar, "はうはう"] # >> [:baz, "もげもげ"]
使い道としては Hash のように複数の値を保持しておくのに便利。
Hashと違ってキーを間違えるとエラーになるので、エラー検出にもよい。
C#でstructure
Mono 2.4 がリリースされたらしいので、久しぶりにC#
でもやってみた。
using System; using System.IO; public struct Hoge { public string foo, bar, baz; public Hoge(string foo, string bar, string baz) { this.foo = foo; this.bar = bar; this.baz = baz; } } class TestRunner { public static void Main() { string s1 = "ほえほえ"; string s2 = "hauhau"; string s3 = "mogemoge"; Hoge baka = new Hoge(s1, s2, s3); System.Console.WriteLine("foo = {0}, bar = {1}, baz = {2}", baka.foo, baka.bar, baka.baz); } } // => foo = ????????????, bar = hauhau, baz = mogemoge
Mac OSX の Terminal.app (UTF-8) で出力したら、日本語が文字化け。
あと、new Hoge() の引数にリテラルを直接入れたら怒られた。さすがにチェックが厳しい。
そんなわけで
数と名前の決まったデータを保持しておくなら、Hashより構造体の方がよさそうです。