Если
A in [x, y, z]
считается действительным решением, тогда функция
in(A, x, y, z)
следует также считать допустимым решением, особенно для языка, который допускает перегрузку операторов, чтобы cmp (A, x, y, z) можно было сопоставить с
A in x y z
Обсуждения до сих пор обсуждались на
if (A == x or y or z).
А как насчет дела
if (A == x and y and z).
Поэтому мы будем использовать varargs, особенность, найденную в c, c ++, c # и java5.
Давайте проиллюстрируем Java.
boolean or(String lhs, String... rhs){
for(String z: rhs){
if (lhs.equals(z) return true;
}
return false;
}
boolean and(String lhs, String... rhs){
for(String z: rhs){
if (!lhs.equals(z) return false;
}
return true;
}
Varargs позволяют вам определять одну функцию, которая принимает переменное число аргументов, чтобы вы могли использовать тот же метод для сравнения
or (A, x)
or (A, x, y)
or (A, x, y, z)
Однако вышеприведенное определено только для сравнения строк, поэтому нам нужно будет создать пару методов для каждого типа аргумента. Но тогда в Java 5 есть дженерики.
<T extends Comparable<T>>boolean or(T lhs, T... rhs){
for(T z: rhs){
if (lhs.compareTo(z)==0) return true;
}
return false;
}
<T extends Comparable<T>>boolean and(T lhs, T... rhs){
for(T z: rhs){
if (lhs.compareTo(z)!=0) return false;
}
return true;
}
Так что теперь вы можете делать сравнения для любого типа, который реализует сопоставимый интерфейс.
and(stringA, stringx, stringy)
or(dateA, datex)
Жаль, Java не позволяет перегрузить операторы, чтобы мы могли сделать
stringA && stringx, stringy
dateA || datex, datey, datez
В c ++ я никогда не пытался перегрузить оператор с помощью varargs, чтобы даже узнать, возможно ли это.
Повторяемость:
Однако, возвращаясь к этому часам позже,
Мы могли бы определить класс
public class <T extends Comparable<T>> Comparigator{
public Comparigator(T lhs){
this.lhs = lhs;
}
final private T lhs;
static public <T extends Comparable<T>> Comparigator is(T lhs){
return (T)new Comparigator(lhs);
}
public boolean inAny(T... rhs){
for(T z: rhs){
if (this.lhs.compareTo(z)==0) return true;
}
return false;
}
public boolean inAll(T... rhs){
for(T z: rhs){
if (this.lhs.compareTo(z)!=0) return false;
}
return true;
}
public boolean gtAny(T... rhs){
for(T z: rhs){
if (this.lhs.compareTo(z)>0) return true;
}
return false;
}
public boolean gtAll(T... rhs){
for(T z: rhs){
if (this.lhs.compareTo(z)<=0) return false;
}
return true;
}
}
Теперь нам вообще не нужна перегрузка оператора, и мы можем сделать
import Comparigator;
.....
is(A).inAny(x,y,z); // or
is(A).inAll(w,x,y,z); // and
is(B).gtAny(k,l,m);
is(C).gtAll(j,k);
И мы могли бы расширить его, и мы могли бы делать inany, inall, gtany, gtall, ltany, ltall и т. Д., Расширяя функциональность сравнения.