me gustaría llamar 'contiene' en mis iterables :-)¿Por qué Iterator tiene un método contains pero Iterable no, en Scala 2.8?
Respuesta
la razón Iterable
no tiene un método contains
se debe a la forma en que se define puede tener consecuencias directas sobre vari ance. Básicamente, hay dos tipos de firmas que tienen sentido para él:
def contains(v: Any): Boolean
def contains(v: A): Boolean
La segunda definición ha aumentado la seguridad del tipo. Sin embargo, A
, que es el parámetro de tipo de colección, aparece en una posición contravariante, lo que obliga a la colección a ser invariante. Se podría definirse así:
def contains[B >: A](v: B): Boolean
pero que no ofrecería ninguna mejora con respecto a la primera firma, utilizando Any
.
Como consecuencia de esto, verá que immutable.Seq
es covariante y utiliza la primera firma, mientras que immutable.Set
es invariable y utiliza la segunda firma.
No sé qué contains
no está definido en Iterable
o TraversableOnce
, pero aquí se puede definir usted mismo:
class TraversableWithContains[A](underlying: TraversableOnce[A]) {
def contains(v: Any): Boolean =
underlying.exists(_ == v)
}
implicit def addContains[A](i: Iterable[A]) = new TraversableWithContains(i)
y utilizarlo como si estuviera definido en Iterable:
val iterable: Iterable[Int] = 1 to 4
assert(iterable.contains(3))
assert(!iterable.contains(5))
- 1. nuevo código {} Iterable de Scala 2.7.7 a 2.8
- 2. En las colecciones de Scala 2.8, ¿por qué se ha agregado el tipo de Traversable arriba Iterable?
- 3. str objeto en Python 2.7 no tiene __iter__, pero actúa como iterable. ¿Por qué?
- 4. Scala: Agrupe un Iterable en un Iterable de Iterables por un predicado
- 5. ¿Por qué las secuencias paralelas de Scala no tienen un método contains?
- 6. Scala Iterable Memory Leaks
- 7. ¿Por qué hay un método iterator() en java.util.Collection
- 8. ¿Por qué la clase python datetime tiene un método 'fromtimestamp', pero no un método 'totimestamp'? clase
- 9. ¿Por qué la opción no extiende el rasgo Iterable directamente?
- 10. ¿Por qué Iterator define la operación remove()?
- 11. ¿Por qué no hay una interfaz "Iterable" en el STL?
- 12. Método 'Boolean Contains (System.String)' no tiene traducción soportada a SQL
- 13. ¿Cuál es la relación entre Iterable e Iterator?
- 14. ¿Por qué el BigDecimal de Scala no tiene un CERO?
- 15. scala 2.8 inconsistencia de colecciones?
- 16. ¿Por qué productIterator return type Iterator [Any]?
- 17. ¿Por qué Scala no tiene una Monad de IO?
- 18. ¿Por qué XElement no tiene un método GetAttributeValue?
- 19. ¿Por qué obtengo un objeto no es un error iterable?
- 20. consumir elementos de un scala Iterator
- 21. ¿Por qué ObservableCollection no tiene un método RemoveAll?
- 22. ¿Por qué se implementa zipWithIndex en Iterable y no Traversable?
- 23. ¿Por qué java.io.File no tiene un método close()?
- 24. ¿Por qué el lenguaje Python no tiene un método writeln()?
- 25. ¿Cómo implemento una colección en Scala 2.8?
- 26. ¿Por qué la Lista de Scala no tiene un campo de tamaño?
- 27. scala Iterable # map vs. Iterable # flatMap
- 28. ¿Por qué Unix tiene fork() pero no CreateProcess()?
- 29. .Contains() método no llamando Ignorar Igual al método
- 30. ¿Implementar Java Iterator e Iterable en la misma clase?
Nota: 'contains' ** está ** implementado usando la firma' contiene [A1>: A] (elem: A1) 'en' SeqLike' (al menos en Scala 2.11.8). No creo que esto sea lo mismo que usar 'Any' - pone algunas restricciones en el tipo' B' - puedes pasar 'Any', pero no puedes pasar un tipo que se sabe que no está relacionado. – Suma
@Suma Seguro que puedes. Adelante, inténtalo. Si pasa un tipo no relacionado, se deducirá que 'A1' es el supertipo común. Y como todo es descendiente de 'Any', todos los tipos tienen un supertipo común entre ellos. –
Tienes razón. ¿Hay alguna razón por la cual la firma está en la biblioteca tal como está, y no con 'Any', mientras escribe, entonces? – Suma