読者です 読者をやめる 読者になる 読者になる

Struct

C# ruby

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より構造体の方がよさそうです。