Tuple
http://d.hatena.ne.jp/akiramei/20040822#p1を参考にさせていただいて、Tupleを実装してみる。Generic Methodを使えば、そこそこ使えるものになるかな。
using System; using System.Collections.Generic; using System.Text; namespace ML { public static class Tuple { static public Tuple<T1> Make<T1>(T1 A) { return new Tuple<T1>(A); } static public Tuple<T1, T2> Make<T1, T2>(T1 A, T2 B) { return new Tuple<T1, T2>(A, B); } static public Tuple<T1, T2, T3> Make<T1, T2, T3>(T1 A, T2 B, T3 C) { return new Tuple<T1, T2, T3>(A, B, C); } static public Tuple<T1, T2, T3, T4> Make<T1, T2, T3, T4>(T1 A, T2 B, T3 C, T4 D) { return new Tuple<T1, T2, T3, T4>(A, B, C, D); } static public Tuple<T1, T2, T3, T4, T5> Make<T1, T2, T3, T4, T5>(T1 A, T2 B, T3 C, T4 D, T5 e) { return new Tuple<T1, T2, T3, T4, T5>(A, B, C, D, e); } } public struct Tuple<T1> { public T1 A; public Tuple(T1 A) { this.A = A; } public void Bind(ref T1 A) { A = this.A; } } public struct Tuple<T1, T2> { public T1 A; public T2 B; public Tuple(T1 A, T2 B) { this.A = A; this.B = B; } public void Bind(ref T1 A, ref T2 B) { A = this.A; B = this.B; } } public struct Tuple<T1, T2, T3> { public T1 A; public T2 B; public T3 C; public Tuple(T1 A, T2 B, T3 C) { this.A = A; this.B = B; this.C = C; } public void Bind(ref T1 A, ref T2 B, ref T3 C) { A = this.A; B = this.B; C = this.C; } } public struct Tuple<T1, T2, T3, T4> { public T1 A; public T2 B; public T3 C; public T4 D; public Tuple(T1 A, T2 B, T3 C, T4 D) { this.A = A; this.B = B; this.C = C; this.D = D; } public void Bind(ref T1 A, ref T2 B, ref T3 C, ref T4 D) { A = this.A; B = this.B; C = this.C; D = this.D; } } public struct Tuple<T1, T2, T3, T4, T5> { public T1 A; public T2 B; public T3 C; public T4 D; public T5 E; public Tuple(T1 A, T2 B, T3 C, T4 D, T5 E) { this.A = A; this.B = B; this.C = C; this.D = D; this.E = E; } public void Bind(ref T1 A, ref T2 B, ref T3 C, ref T4 D, ref T5 E) { A = this.A; B = this.B; C = this.C; D = this.D; E = this.E; } } }
public static class Program { public static void main(string [] args) { Tuple<int,string> t = ML.Tuple.Make(1, "hello"); => (1,"hello") : int * string int i = 0; string s = ""; t.Bind(ref i, ref s); => i=1, s="hello" } }
パターンマッチがないので、あまり使いではないが、わざわざクラスを定義するまでもないpairを保存するときに使えるかも。
なんで、ほとんどid:akirameiさんのと同じコードを書いたのかというと、次の日使うから。