2011-08-24 12 views

Respuesta

9

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.

+1

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

+4

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. –

3

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 java addAll
  • :+ 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).

+0

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. –

+0

Sí, tienen una semántica diferente en Scala, pero sigue siendo una operación de "agregar". – paradigmatic

4

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.

0

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.

http://scala-programming-language.1934581.n4.nabble.com/How-to-set-the-scale-for-scala-BigDecimal-s-method-td1948885.html

http://www.scala-lang.org/node/2177

2

¿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 +.

Cuestiones relacionadas