Me pregunto si la biblioteca estándar es completamente null
-free y, de lo contrario, estaría interesado en qué casos de uso razonables existen donde devolver null
es preferible a devolver alguna instancia de Option
.¿Qué métodos de Scala devuelven null en lugar de una opción y por qué?
Respuesta
NamespaceBinding devuelve null
para el espacio de nombres local o en el siguiente caso una entrada no definida.
$ scala
Welcome to Scala version 2.9.0.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_24).
Type in expressions to have them evaluated.
Type :help for more information.
scala> (<foo/>).scope.getURI("something")
res0: String = null
¿Por qué se trata de utilizar String
en lugar de Option[URI]
, no sé.
Relacionado con 'scala.xml.Elem' que toma un valor de prefijo' String' que se espera que sea 'nulo' para ningún prefijo de espacio de nombres. Una vez más, por qué no es 'Option [String]' está más allá de mí. –
Al menos es constantemente molesto ... –
No puedo pensar en ninguno, así que hice una búsqueda en Google en la API (inurl: scala-lang.org/api return + null) y no pareció dar ningún uso documentado de null.
Puede haber un uso interno som. Las únicas razones por las que se me ocurre hacer eso serían evitar el Some-object extra o una integración fácil con java. Ambos parecen poco probables.
Como Scala no usa 'return' la mayor parte del tiempo, esta búsqueda realmente no atrapará mucho. –
No estaba hablando de retorno en el código, pero regreso en comentario – thoredge
El único lugar que he visto null
utilizado en la biblioteca estándar son grupos regex opcionales.
scala> val number = """(\d+)(\.\d+)?""".r // matches digits optionally followed by a . and more digits
number: scala.util.matching.Regex = (\d+)(\.\d+)?
scala> "12" match {
| case number(intPart, decimalPart) => (intPart, decimalPart)
| }
res0: (String, String) = (12,null)
creo, el razonamiento aquí es que usted no desea utilizar Option[String]
para todos los grupos. Esto haría el código innecesariamente torpe, si un grupo no es opcional. Desafortunadamente, no se conoce en tiempo de compilación si un grupo es opcional. Por lo tanto, es Option[String]
para todos los grupos o null
para grupos que no coinciden.
Me gusta mucho el hecho de que Regex se convierta automáticamente en patrón de coincidencia, y el hecho de que en el 90% de los casos querría un 'String' recto; pero como Scala está casi exento de excepciones raras, puede haber sido una buena idea si usa 'Option [String]' para coherencia. 'La opción [String]' y/o 'List' aparece con frecuencia cuando se analiza Json y no creo que les importara mucho, ya que los usaría para la comprensión. –
@Eugene Consejo: si especifica el tipo, no coincidirá con 'null'. Por ejemplo, 'case number (intPart: String, decimalPart: String)' no coincidirá con la cadena de arriba. –
- 1. ¿Por qué null == myVar en lugar de myVar == null?
- 2. Python 3.0 - los métodos dict devuelven vistas - ¿por qué?
- 3. ¿Por qué utilizar EventArgs.Empty en lugar de null?
- 4. getElementById y null - ¿por qué?
- 5. ¿Por qué null cast?
- 6. ¿Por qué los métodos position() y offset() de jQuery devuelven un número fraccionario en Chrome?
- 7. ¿Por qué `this.synchronized` en lugar de simplemente` synchronized` en Scala?
- 8. ¿Por qué usar curl en lugar de otros métodos?
- 9. ¿Por qué utilizar un singleton en lugar de métodos estáticos?
- 10. ¿Por qué las llamadas al sistema devuelven EFAULT en lugar de enviar una segfault?
- 11. ¿Por qué la biblioteca de tiempo de ejecución es una opción de compilación en lugar de una opción de enlazador?
- 12. Python: ¿Por qué extends() y append() devuelven None (void)?
- 13. ¿Por qué RijndaelManaged y AesCryptoServiceProvider devuelven resultados diferentes?
- 14. Por qué Images.Media.insertImage return null
- 15. Regex.MatchData que devuelve nulo: ¿por qué no Opción [String]?
- 16. null.Equals (null) ¿Por qué aparece una NullReferenceException
- 17. ¿Por qué SUM (...) en un conjunto de registros vacío devuelve NULL en lugar de 0?
- 18. CLR pregunta. ¿Por qué la sobrecarga de métodos en C# decide que null es una cadena?
- 19. MongoDB: ¿Qué hace getLastError() devuelven
- 20. ¿Por qué se devuelven cadenas vacías en resultados de división()?
- 21. ¿Por qué la opción [T] de Scala no se traduce directamente a un T en bytecode?
- 22. ¿Por qué funciona String (null)?
- 23. ¿De qué sirven los métodos asociativos de derechos en Scala?
- 24. AIR: ¿Por qué stage == null?
- 25. ¿Por qué gcc tiene una opción -incluir?
- 26. ¿Por qué usar HTTP PUT y DELETE métodos en lugar de POST?
- 27. ¿Por qué utilizar una oreja en lugar de una guerra?
- 28. ¿Por qué aplicar Rapply y aplicar NULL de forma diferente?
- 29. ¿Por qué se deben declarar las acciones de grial como métodos en lugar de cierres y qué diferencia hace?
- 30. ¿Por qué bloquear en lugar de buclear?
El único caso de uso razonable para devolver 'null' es cuando está utilizando una biblioteca que espera que' devuelva 'nulo' de una devolución de llamada como una indicación de" no resultado ". Esto es a menudo un mal necesario cuando se trata de bibliotecas heredadas de Java a partir del código de Scala. –
En general, los métodos de la biblioteca de Scala devolverán la opción o emitirán una excepción si se llaman de forma inapropiada (por ejemplo, cabecera y última en la lista). No conozco ninguno que devuelva nulo. –