Weeral een stapje dichter tot een deftig typesystem: union types zijn er nu.
Deze function aanvaard geen nil, deze function is m.a.w. nil-safe:
function sum(Int a, Int b) returns Int {
return a + b;
}
Bij veel code is het moeilijker om alles nil safe te houden, dus je kan nu ook zeggen dat parameter a en b ook nil aanvaarden:
function sum(Int|None a, Int|None b) returns Int {
if a == nil || b == nil {
return 0;
}
return a + b ;
}
println(sum(1, 2)); #=> 3
println(sum(nil, 2)); #=> 0 (en geen crash)
Je kan dit ook op return types doen trouwens:
function leeftijd(x) returns Int|Str {
if x < 18 {
return "te jong";
}
return x;
}
println("Je bent " ~ leeftijd(15)); #=> Je bent te jong
println("Je bent " ~ leeftijd(19)); #=> Je bent 19
Oja, given statement. Zie het als een switch statement maar dan beter.
x = 18;
given x {
when 18 {
println("Je bent 18 jaar.");
}
when > 19, 16 {
println("Je bent ouder dan 19, of 16 jaar.");
}
otherwise {
println("Je bent " ~ x ~ " jaar.");
}
}
In het voorbeeld gebruik ik > en <, maar je kan iedere binary operator gebruiken.
x = 18;
given x {
when instanceof Int { println("Ik ben een nummer!"); }
when instanceof Str { println("Ik ben een string!"); }
}