Las colecciones Scala tienen un grupo de operadores legibles y casi legibles como :+
y +:
, pero ¿por qué no hay sinónimos legibles como humanos? append
?¿Por qué las colecciones scala no tienen ningún método legible como .append, .push, etc.
Respuesta
Todos mutables colecciones en Scala tienen la BufferLike trait y que define una método append.
inmutables colecciones no tienen el rasgo BufferLike y por tanto sólo definen los otros métodos que no cambian la colección en lugar, pero generan una nueva.
De hecho a menudo algunos sinónimos legibles:
foldLeft
es equivalente a/:
foldRight
es equivalente a:\
Los restantes son operadores de suma, que son bastante humana legibles como son:
++
es equivalente a javaaddAll
:+
es anexar+:
se prepend
La posición del punto y coma indica la instancia receptor.
Finalmente, algunos operadores raros son legados de otros lenguajes de programación funcionales. Tales como la construcción de lista (SML) o la mensajería del actor (erlang).
No estoy seguro de que ': +' y 'append' sean iguales. Creo que el primero (de 'SeqLike') crea una nueva colección, mientras que el último (de' BufferLike') modifica el buffer en su lugar. –
Sí, tienen una semántica diferente en Scala, pero sigue siendo una operación de "agregar". – paradigmatic
Los nombres de métodos simbólicos permiten la combinación con la operación de asignación =
.
Por ejemplo, si usted tiene un método ++
que crea una nueva colección, se puede usar de forma automática ++=
para asignar la nueva colección de alguna variable:
var array = Array(1,2,3)
array ++= Array(4,5,6)
// array is now Array(1,2,3,4,5,6)
Esto no es posible sin los nombres de métodos simbólicos.
La biblioteca estándar de Scala no pretende ser amigable para Java. En su lugar, se proporcionan adaptadores para convertir entre las colecciones de Java y Scala.
Intentar proporcionar una API compatible con Java no solo limitaría la elección de los identificadores (o el mandato de que se proporcionen alias), sino que también limitaría la forma en que se utilizaron los genéricos y los tipos de funciones. Se necesitarán sustancialmente más pruebas para validar el diseño.
Sobre el mismo tema, recuerdo algún debate sobre si las colecciones 2.8 deberían implementar java.util.Iterable
.
¿Es diferente que cualquier otro idioma?
Tomemos Java. ¿Cuál es la versión humana legible de +
, -
, *
y /
en int
? O tomemos String
: ¿cuál es la versión humana legible de +
? Tenga en cuenta que concat
no es lo mismo; no acepta parámetros que no sean String
.
Quizás le moleste porque en Java -a diferencia de, digamos, C++- las cosas usan exclusivamente operadores no alfabéticos u operadores alfabéticos, con la excepción de String
's +
.
- 1. ¿Por qué las listas de Scala no tienen un pedido?
- 2. ¿Por qué las secuencias paralelas de Scala no tienen un método contains?
- 3. En psql, ¿por qué algunos comandos no tienen ningún efecto?
- 4. ¿Por qué un método de rubí tienen como método
- 5. por qué un constructores estáticos no tienen ningún parámetro
- 6. ¿Por qué las vistas pregeneradas de mi código EF First no tienen ningún efecto?
- 7. Salida XML legible por humanos de Scala?
- 8. Incoherencias de Colecciones Scala
- 9. ¿Por qué Java varargs no admite colecciones?
- 10. ¿Por qué el iterador no tiene ningún método de reinicio?
- 11. ¿Por qué las tuplas tienen uses_allocator pero los pares no?
- 12. ¿Qué operaciones en las colecciones paralelas de Scala están paralelizadas?
- 13. ¿Por qué Java no tiene ningún destructor como C++?
- 14. ¿Por qué las continuaciones no tienen una utilidad útil?
- 15. Python: ¿Por qué las listas no tienen un método de búsqueda?
- 16. ¿Por qué la función [-A1, ..., + B] no trata de permitir ningún supertipo como parámetro?
- 17. La deforestación en colecciones Scala
- 18. ¿Por qué los miembros de la interfaz no tienen ningún modificador de acceso?
- 19. ¿Por qué todas las colecciones base inmutables son definitivas o selladas en scala?
- 20. C++ Los constructores no tienen ningún tipo de devolución. ¿Exactamente por qué?
- 21. ¿Por qué las colecciones paralelas de Scala a veces causan un OutOfMemoryError?
- 22. ¿Por qué no puede Python inferir tipos como scala?
- 23. ¿Qué son las colecciones implementadas como en VB6?
- 24. scala 2.8 inconsistencia de colecciones?
- 25. Transposición de colecciones arbitrarias de colecciones en Scala
- 26. Scala interbloqueo con colecciones paralelas
- 27. Clases de casos de Scala en colecciones
- 28. ¿Por qué los ayudantes no tienen html en ellos?
- 29. ¿Puedes tener mongo $ push prepend en lugar de append?
- 30. Actualizando las colecciones de Scala de forma segura
Sí, pero ¿por qué? Puedo vivir con un Seq que devuelve un nuevo Seq después de 'append'. ¿Por qué no agregar dichos alias, al menos para una interoperabilidad Java más sencilla? – F0RR
La semántica, se agrega en Java y se usa para varias clases de búfer diferentes, como StringBuffer y StringBuilder, cuando usa append espera que se agregue al objeto actual, no crea un nuevo objeto. Al definir un método de adición que crea un nuevo objeto, se rompe esta expectativa, lo cual no es nada agradable. –