Si
A in [x, y, z]
se considera una solución válida, entonces la función
in(A, x, y, z)
debe considerarse una solución válida también, especialmente para un lenguaje que permite la sobrecarga de operadores para que cmp (a, x, y, z) podría ser mapeada a
A in x y z
discusiones hasta ahora han insistido en
if (A == x or y or z).
¿Qué pasa con el caso de
if (A == x and y and z).
por lo tanto, usaríamos varargs, una característica que se encuentra en C, C++, C# y java5.
Vamos a usar Java para ilustrar.
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 le permiten definir una única función que toma en un número variable de argumentos para que usted podría utilizar el mismo método para comparar
or (A, x)
or (A, x, y)
or (A, x, y, z)
Sin embargo, lo anterior se define sólo por las comparaciones de cadenas , de modo que tendríamos que crear un par de métodos para cada tipo de arg. Pero luego en Java 5 hay genéricos.
<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;
}
Ahora puede hacer comparaciones para cualquier tipo que implemente una interfaz comparable.
and(stringA, stringx, stringy)
or(dateA, datex)
Lástima, Java no permite la sobrecarga de operadores para que pudiéramos hacer
stringA && stringx, stringy
dateA || datex, datey, datez
en C++, nunca he intentado la sobrecarga de operadores con varargs saber incluso si es posible.
Revisita: Sin embargo, volver a visitar esta hora más tarde,
podríamos definir una clase
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;
}
}
Ahora, no necesitamos la sobrecarga de operadores en todo y nos puede hacer
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);
Y podríamos expandirlo y podríamos hacerlo en cualquier, en todos, gtany, gtall, ltany, ltall, etc. mediante la expansión de la co funcionalidad de comparación.
Eso es una especie de trampa;) También podrías hacer eso con IList + LINQ en .NET. –
Eso no es hacer trampa, así es como lo haces. ¡Las cosas del lado izquierdo las obtienes gratis! – Thomas
Aceptado, aunque como se mencionó, es un poco engañoso y requiere una lista en lugar de implementarse directamente en el lenguaje si se construye. – Finglas