Se
A in [x, y, z]
è considerato una valida soluzione, allora la funzione
in(A, x, y, z)
dovrebbe essere considerato una valida soluzione troppo
, soprattutto per un linguaggio che permette all'operatore sovraccarico modo che CMP (A, x, y, z) potrebbe essere mappati
A in x y z
discussioni finora hanno soffermati su
if (A == x or y or z).
e il caso di
if (A == x and y and z).
Pertanto, useremmo varargs, una funzionalità presente in C, C++, C# e java5.
Usiamo java per illustrare.
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 consentono di definire una singola funzione che prende in un numero variabile di argomenti in modo che si può usare lo stesso metodo per confrontare
or (A, x)
or (A, x, y)
or (A, x, y, z)
Tuttavia, quanto sopra è definita solo per confronti stringa , così dovremmo creare un paio di metodi per ogni tipo di arg. Ma poi in Java 5 ci sono i generici.
<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;
}
Così ora è possibile fare confronti per qualsiasi tipo che implementa un'interfaccia comparabile.
and(stringA, stringx, stringy)
or(dateA, datex)
Peccato, Java non permette l'overloading degli operatori in modo che si possa fare
stringA && stringx, stringy
dateA || datex, datey, datez
in C++, non ho mai tentato l'overloading degli operatori con varargs sapere anche se è possibile.
Revisit: Tuttavia, rivisita questo ore più tardi,
potremmo definire una classe
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;
}
}
Ora, non abbiamo bisogno di overloading degli operatori a tutti e possiamo fare
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);
E potremmo espanderlo e potremmo fare tutto, in tutto, gtany, gtall, ltany, ltall, ecc espandendo il co mparison funzionalità.
È una specie di imbroglio;) Lo si può fare anche con IList + LINQ in .NET. –
Non è barare, è così che lo fai. Le cose sul lato sinistro si ottiene gratis! – Thomas
Accettato, sebbene come detto sia un po 'imbroglio e richiede una lista piuttosto che essere implementato direttamente nel linguaggio se costrutto. – Finglas