Pregunta

Nos han perfilado nuestro código recientemente y nos hemos encontrado unos pocos puntos de acceso molestos. Están en la forma

assert(a == b, a + " is not equal to " + b)

Debido a que algunos de ellos afirma puede ser de código llamado una enorme cantidad de veces que el concat cadena comienza a tener sentido. assert se define como:

def assert(assumption : Boolean, message : Any) = ....

¿por qué no se lo define como:

def assert(assumption : Boolean, message : => Any) = ....

De esta manera se evaluaría con pereza. Dado que no se define de esa manera hay una manera en línea de llamar a afirmar con un parámetro de mensajes que se evalúa con pereza?

Gracias

¿Fue útil?

Solución

evaluación Lazy tiene también algo de sobrecarga para el objeto función creada. Si su objeto de mensaje ya está totalmente construido (un mensaje estático) esta sobrecarga es innecesaria.

El método apropiado para su caso de uso sería de estilo sprintf:

assert(a == b,  "%s is not equal to %s", a, b)

Mientras no es una función speciaized

assert(Boolean, String, Any, Any)

esta implementación tiene ninguna sobrecarga o el costo de la matriz args var

assert(Boolean, String, Any*)

para el caso general.

toString La implementación sería evaluado con pereza, pero no se puede leer:

assert(a == b, new { override def toString =  a + " is not equal to " + b })

Otros consejos

Es por nombre, lo cambié hace más de un año.

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

Predef actual:

@elidable(ASSERTION)
def assert(assertion: Boolean, message: => Any) {
  if (!assertion)
    throw new java.lang.AssertionError("assertion failed: "+ message)
}

Respuesta de Thomas es grande, pero en caso de que le gustaba la idea de la última respuesta, pero no les gusta la ilegibilidad, se puede conseguir alrededor de él:

object LazyS {
  def apply(f: => String): AnyRef = new {
    override def toString = f
  }
}

Ejemplo:

object KnightSpeak {
  override def toString = { println("Turned into a string") ; "Ni" }
}

scala> assert(true != false , LazyS("I say " + KnightSpeak))

scala> println( LazyS("I say " + KnightSpeak) )
Turned into a string
I say Ni

Probar: assert( a==b, "%s is not equals to %s".format(a,b)) El formato sólo debe ser llamada cuando la aserción necesita la cadena. se añade formato a través de RichString implícita.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top