今度は、比較演算子をオーバーライドします。
まず、どんなことがやりたいかというと、
<members> <person name='masuda'>masuda tomoaki</person> <person name='yamada'>yamada taro</person> </members>
こんな風な XML があったときに、name 属性が “yamada” の要素をとりたいとします。
この場合のコードを
EXElement el = doc / "members" / "person" % "name" == "yamada";
と書きたい訳ですね。LINQ の文法で言えば、where 句があって、ってことになるのですが、そんな面倒なことを EXDoc ではやりませんッ!!! と言いますか、このあたりがコード上のシンタックスシュガーな訳なのです。
% 演算子を使って属性の値が取れるので、これを == 演算子で比較します。
普通は、bool 値で true/false で返すのですが、それでは意味がないのですね。どうせならば、マッチする要素を取って来てほしい。
なので、== 演算子の戻り値を、bool 型じゃなくて、EXElements 型にしてしまいますw
なんか、後で破綻しそうな気もしますが、別に構いません。C# の文法に則ったまま、ちょっと不思議な言語を作っている気分なので。
そんな訳で、== 演算子を多重定義します。
public static EXElements operator ==(EXAttrs ats, string val) { EXElements items = new EXElements(); foreach (EXAttr at in ats) { if (at.Value == val) { items.Add(at._exElement); } } return items; } public static EXElements operator !=(EXAttrs ats, string val) { EXElements items = new EXElements(); foreach (EXAttr at in ats) { if (at.Value != val) { items.Add(at._exElement); } } return items; } public override bool Equals(object obj) { return base.Equals(obj); } public override int GetHashCode() { return base.GetHashCode(); }
どうやら、== 演算子を多重定義すると自動的に、
・!= 演算子
・Equals メソッド
・GetHashCode メソッド
もオーバーライドする必要があるので、適当に入れておきます。
こうすることで、
EXElement el = doc / "members" / "person" % "name" == "yamada";
このコードが、思った通りに動くようになります。
そう、これって UIDD(User Interface Driven Development)と言ってもいいかもとか、思いました。あるいは、You & I Driven Development とか。
一応 wikipedia にもあるみたい。ちょっと違いますが。
http://ja.wikipedia.org/wiki/UIDD