2011-08-10 8 views
7

Después de una conversación con un amigo acerca de la sobrecarga del operador. Estoy buscando ejemplos de uso creativo y/o útil de la sobrecarga del operador en Scala. Tengo algunas ilustraciones fresco:Ejemplos de uso creativo y útil del operador en Scala

  • matemáticos construcciones, como álgebra lineal o números complejos (+ * -)
  • Imitando tubo Shell y redirecciones (| > < >>)
  • expresiones alternativas en las gramáticas (|)

¿Tiene otros buenos ejemplos?

+0

Demasiada creatividad suele ser algo malo, ya que infringe las expectativas. La sobrecarga del operador es más poderosa cuando se usa como todos esperarían: sí, por supuesto '*' multiplica los números complejos tanto como los dobles. Por ejemplo, nombrar su variable de retorno 'frodo' y una variable de intercambio temporal' sam' es creativa en cierto sentido, pero es bastante incomprensible (especialmente para personas que no están familiarizadas con El señor de los anillos). Nombrar su variable de retorno '<---' y su variable swap '<-->' probablemente no sea mucho mejor. –

+1

Para los nuevos en Scala, tenga en cuenta que la "sintaxis de operador" de Scala es simplemente una buena forma de llamar a los métodos ordinarios de Scala. Entonces 'x + y' es lo mismo que' x. + (Y) '. En ambos casos, '+' es un método ordinario en el objeto 'x', que podría ser de tipo' Int', 'Double', etc. La sintaxis del operador no necesita un método simbólico (por ejemplo,' list1 zip list2 'funciona), pero el uso de un método simbólico permite a Scala aplicar reglas de prioridad incorporadas. –

+0

Lo sentimos, pero SO aún no acepta "enumerar todas sus preguntas X favoritas para Y". A menos que su problema actual sea * Necesito enumerar todos los operadores * o algo así, esto está fuera del alcance de acuerdo con [faq]. –

Respuesta

7

Los que no les importa usar ocasionalmente:

  • Un tubo de propósito general |> (por ejemplo, someValue |> println)
  • := uno algunas estructuras como los titulares de valores observables para imitar asignación
  • Databinding en la programación de interfaz de usuario con <=> (bidireccional), <== (unidireccional) (por ejemplo, field.enabled <=> options.isEditable
2

Este es un tema un poco controvertido en la comunidad Scala. Una persona de un lado teme el abuso podría conducir a programas incomprensibles. Si piensas en en serio, ya existe. Porque, ¿qué operadores se sienten 'naturalmente'? Así que vamos a tomar operadores matemáticos: + - */ Entonces, ¿por qué en 'la mayoría' de los lenguajes de programación + se define en cadenas?

Por otro lado, los operadores "bien conocidos" podrían conducir a un código más conciso y comprensible. Scala admite símbolos Unicode para que pueda usar símbolos como/u + 2211. Ejemplo: List (1,2,3) .sum // nos daría 6, usando sum en lugar de/u + 2211 porque no tiene soporte para teclado unicode.

Entonces en lugar de 3 caracteres (s, u, m) tenemos uno (/ u + 2211) ¿Es esto bueno o malo? En mi opinión, la comunidad scala encontrará sentido común sobre este tema, pero llevará algo de tiempo.

Otros lenguajes de programación que admiten expresiones unicode incluyen fortaleza.

4

Encuentro dos operadores "incorporados" útiles en Scala: :: y ->.

En la creación de mapas, puede escribir Map("a" -> 1) y Scala traduce "a" -> 1 en ("a", 1) tupla. :: se utiliza para agregar al frente de la lista, también es muy conveniente.

También += y -= operadores para las colecciones son geniales, especialmente porque se aplican a los mutables e inmutables también.

2

Hace un tiempo I showed cómo crear una DSL con operadores para manipular los nodos y las propiedades de un árbol JCR. Si se presenta correctamente, el código se asemeja a un dibujo de arte ASCII del árbol de contenido real.El siguiente código Scala

root ¦- "movies" -+ { n: Node => 
       n ¦= ("title", "Night on Earth") 
       n ¦= ("length", 123L) 
       n ¦= ("ratings", 9L::8L::5L::Nil) 
       n ¦= ("languages", "en"::"it"::"fi"::"fr"::Nil) 
       n ¦- "cast" -+ { n: Node => 
          n ¦= ("Gena Rowlands", "Victoria Snelling") 
          n ¦= ("Winona Ryder", "Corky") 
          n ¦= ("Roberto Benigni", "Taxi Driver") }} 

es equivalente a esta versión en Java:

Node movies = root.addNode("movies"); 
    movies.setProperty("title", "Night on Earth"); 
    movies.setProperty("length", 123L); 
    movies.setProperty("ratings", new String[]{"9", "8", "5"}, PropertyType.LONG); 
    movies.setProperty("languages", new String[]{"en", "it", "fi", "fr"}, PropertyType.STRING); 
    Node cast = movies.addNode("cast"); 
    cast.setProperty("Gena Rowlands", "Victoria Snelling"); 
    cast.setProperty("Winona Ryder", "Corky"); 
    cast.setProperty("Roberto Benigni", "Taxi Driver"); 

Aunque no es necesariamente útil, podría merecer un punto de creatividad.

+1

Si sangró la versión de Java como la versión de Scala, no se vería tan mal ... –