version 3.2.7リリース。パターンマッチングを実装していってます。
version 3.2.7
whenの仕様が変わってます
whenにwildcardを入れました。
> vim PaternMatching.clcl
class PatternMatchingTest
{
value1: int;
value2: String;
def initialize(value1:int, value2:String) {
self.value1 = value1;
self.value2 = value2;
}$
def equals(right:PatternMatchingTest):bool {
return self.value1 == right.value1 && self.value2.equals(right.value2);
}
}
class PatternMatchingTest2
{
value1: Integer;
value2: String;
def initialize(value1:Integer, value2:String) {
self.value1 = value1;
self.value2 = value2;
}$
def equals(right:PatternMatchingTest2):bool {
return self.value1.equals(right.value1) && self.value2.equals(right.value2);
}$
}$
> vim a.cl
a:Anonymous = "ABC";
c:String = when(a) {
is String {
a;
}
else {
"else";
}
}
Clover.test("Pattern matching test", c.equals("ABC"));
b:Anonymous = new Integer(123);
d:String = when(b) {
!is String {
"111";
}
else {
"else"$
}
}
Clover.test("Pattern maching test2", d.equals("111"));
e:Anonymous = new PatternMatchingTest(111, "ABC");
f:String = when(e) {
case new PatternMatchingTest(111, "ABC"): {
"ABC";
}
else {
"DEF";
}
}
Clover.test("Pattern matching test3", f.equals("ABC"));
g:Anonymous = new PatternMatchingTest(222, "DEF");
f = when(g) {
case new PatternMatchingTest(111, "DEF"): {
"ABC"
}
case new PatternMatchingTest(222, wildcard): {
"DEF";
}
else {
"GHI";
}
}
Clover.test("Pattern matching test4", f.equals("DEF"));
i:Anonymous = new PatternMatchingTest2(123, "ABC");
j:String = when(i) {
case new PatternMatchingTest2(wildcard, wildcard): {
"ABC";
}
else {
"DEF";
}
}
Clover.test("Pattern matching test5", j.equals("ABC"));
ただし、wildcardはプリミティブ型には代入することができないので、wildcardを使いたい時はintクラスじゃなくてIntegerクラスなどを使ってください。