vorrei chiamare 'contiene' le mie iterabili :-)Perché Iterator ha un metodo contiene ma Iterable no, in Scala 2.8?
risposta
la ragione Iterable
non ha un metodo contains
è perché il modo in cui viene definito può avere conseguenze dirette sui vari ANCE. Fondamentalmente, ci sono due firme tipo che hanno senso per esso:
def contains(v: Any): Boolean
def contains(v: A): Boolean
La seconda definizione è aumentata sicurezza tipo. Tuttavia, A
, che è il parametro type della raccolta, appare in una posizione contraria alla variante, che forza la collezione a essere invariata. Si potrebbe essere definito in questo modo:
def contains[B >: A](v: B): Boolean
ma che non offrirebbe alcun miglioramento rispetto al primo firma, utilizzando Any
.
Come conseguenza di ciò, vedrete che immutable.Seq
è in co-variante e utilizza la prima firma, mentre immutable.Set
è invariante e utilizza la seconda firma.
Non so perché contains
non è definito sulla Iterable
o TraversableOnce
, ma si potrebbe facilmente definire da soli:
class TraversableWithContains[A](underlying: TraversableOnce[A]) {
def contains(v: Any): Boolean =
underlying.exists(_ == v)
}
implicit def addContains[A](i: Iterable[A]) = new TraversableWithContains(i)
e usarlo come se fosse definita Iterable:
val iterable: Iterable[Int] = 1 to 4
assert(iterable.contains(3))
assert(!iterable.contains(5))
- 1. Nelle raccolte di Scala 2.8, perché il tipo Traversable è stato aggiunto sopra Iterable?
- 2. Perché Scala ha SeqView ma non SetView?
- 3. Scala Iterable Memory Leaks
- 4. Scala: Raggruppa un Iterable in Iterable of Iterables secondo un predicato
- 5. In scipy.stats rv_continuous ha un metodo di adattamento per trovare gli MLE, ma rv_discrete no. Perché?
- 6. Scala 2.8 Breakout
- 7. scala trasformando un Iterator [Opzione [T]] in un Iterator [T]
- 8. Qual è la relazione tra Iterable e Iterator?
- 9. Perché l'opzione non estende direttamente il tratto Iterable?
- 10. Combinazione dell'opzione Scala [Iterable [_]]
- 11. scala Iterable # map vs. Iterable # flatMap
- 12. inconsistenza di scala 2.8 collezioni?
- 13. Perché Iterator definisce l'operazione remove()?
- 14. Perché Collections.Generic.Queue non ha il metodo sincronizzato ma Collections.Queue ha?
- 15. Conversione di Scala Iterator in un vettore
- 16. Come posso convertire Java Iterable in Scala Iterable?
- 17. raggruppare gli elementi in un iterable cercando un valore sentinella (in scala)
- 18. come passare una stringa * scala vararg a un metodo Java utilizzando Scala 2.8
- 19. Perché non c'è un'interfaccia "Iterable" nell'STL?
- 20. Scala: partecipare a un iterable di stringhe
- 21. Pacchetto modificatore privato in Scala 2.8
- 22. Perché ICollection non contiene un metodo Aggiungi?
- 23. Iterator metodo successivo
- 24. Perché Eclipse lo compila, ma javac no?
- 25. Perché Map non ha un metodo mappa?
- 26. Creazione di un memoriale O (1) Iterable da un oggetto iniziale e una funzione che genera l'oggetto successivo, in Scala
- 27. Perché l'elenco Scala non ha un campo dimensione?
- 28. Scala convertire Iterable o collection.Seq per collection.immutable.Seq
- 29. Come chiamare Scala Queue.enqueue (iter: Iterable [B])?
- 30. Conversione di Scala Iterable [tupla] in RDD
Nota: 'contains' ** è ** implementato utilizzando la firma' contiene [A1>: A] (elem: A1) 'in' SeqLike' (almeno in Scala 2.11.8). Non penso che questo sia lo stesso che usare 'Any' - pone alcuni vincoli sul tipo' B' - puoi passare 'Any', ma non puoi passare un tipo che è noto per non essere correlato. – Suma
@Suma Certo che puoi. Vai avanti e prova. Se si passa un tipo non correlato, 'A1' sarà considerato il supertipo comune. E poiché tutto è discendente da "Qualsiasi", tutti i tipi hanno un supertipo comune tra loro. –
Hai ragione. C'è qualche ragione per cui la firma nella libreria così com'è, e non con 'Any', come scrivi, allora? – Suma