2011-07-07 15 views
5

quiero hacer algo como esto:Scala: ¿Puede una referencia literal en sí?

scala> "Hello world"(this.length -1) 
res30: Char = d 

Esto, obviamente, no funciona ya que no puedo hacer referencia a "Hola mundo" sin antes de guardarla como un val.

¿Hay alguna forma de lograr esto?

+2

¿Está buscando producir 'd' en lugar de 'l'? Lo siento, solo estoy seguro ... –

+0

@Ray, he corregido el error tipográfico. – Rahul

Respuesta

22

Si lo que desea es el último carácter de la cadena, que sólo puede hacer:

scala> "Hello World".last 
res0: Char = d 

Para un problema general, es posible que desee utilizar el operador de la tubería hacia adelante, como se muestra a continuación:

scala> "Hello World" |> { t => t(t.length - 1) } 
res1: Char = d 

Puede definir el operador de canal directo como se muestra a continuación, o usar el disponible en Scalaz.

scala> implicit def anyWithPipe[A](a: A) = new { 
    | def |>[B](f: A => B): B = f(a) 
    | } 
anyWithPipe: [A](a: A)java.lang.Object{def |>[B](f: (A) => B): B} 
+0

[Scalaz] (http://code.google.com/p/scalaz/) es una biblioteca que proporciona "clases de tipos y estructuras de datos funcionales puras para Scala", incluido el operador de pipa directa '|>'. [Documentación y descargas en Google Code] (http://code.google.com/p/scalaz/), [código fuente en GitHub] (https://github.com/scalaz/scalaz). –

+0

@RoryO'Kane, si observa detenidamente, notará que menciono a Scalaz en mi respuesta. – missingfaktor

+0

Lo sé. Estaba proporcionando un enlace y una descripción de Scalaz para que otras personas no tengan que buscarlo en Google, como tenía que hacerlo. Repetí que Scalaz incluye '|>' para el beneficio de los skimmers. –

3

No puede hacer referencia al literal en sí, pero puede crear un bloque con una variable temporal local para ese bloque.

scala> val lastChar = { val tmp = "Hello World"; tmp(tmp.length - 1) } 
lastChar: Char = d 

scala> tmp 
<console>:8: error: not found: value tmp 
Cuestiones relacionadas