escribo una serie de guiones Scala simples que terminan a partir de un simple ajuste de patrones en args
como:args coincidencia de patrones y dar mensajes de error en un script ligero Scala
val Array(path, foo, whatever) = args
// .. rest of the script uses "path", "foo", etc.
Por supuesto, si yo proporciono la número incorrecto de argumentos, me sale un error inescrutable como:
scala.MatchError: [Ljava.lang.String;@7786df0f
at Main$$anon$1.<init>(FollowUsers.scala:5)
...
¿hay una manera fácil de dar un mensaje de error más útil? Mi solución actual es hacer algo como:
args match {
case Array(path, foo, whatever) => someFunction(path, foo, whatever)
case _ => System.err.println("usage: path foo whatever")
}
def someFunction(path: String, foo: String, whatever: String) = {
// .. rest of the script uses "path", "foo", etc.
}
Pero que se siente como un montón de repetitivo lo de tener que definir una otra función entera, y tener que repetir "camino", "foo" y "lo que" en tantos lugares ¿Hay una mejor manera? Supongo que podría perder la función y poner el cuerpo en la declaración del partido, pero eso me parece menos legible.
Sé que podría utilizar uno de los muchos paquetes de análisis de argumentos de línea de comandos, pero realmente estoy buscando algo extremadamente liviano que no tenga que agregar una dependencia y modificar mi classpath.
Sí, creo que está bien, aunque obtendrá un seguimiento de pila en lugar de un mensaje de error directo. – Steve
Esto es para lo que 'requiere '. P.ej. 'require (args.length == 3," args debe tener una longitud tres en la llamada a XYZ ")' –
La versión con "require" es agradable y simple. Sin embargo, obtienes una excepción muy detallada con eso: 'java.lang.IllegalArgumentException: requisito fallido: usage: path foo whatever' (y luego todo el traceback habitual). Tiene mucho sentido para un desarrollador de Scala, pero puede ser un poco confuso para alguien que no conoce a Scala pero que solo quiere usar mi script. – Steve