assert Scala Slow
-
19-09-2019 - |
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
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.