Creé un tipo usando defrecord
con sugerencias de tipo para los campos. Sin embargo, descubrí que estos consejos tipo no se aplican en los constructores y puedo hacer algunas cosas extrañas con ellos. Mira el siguiente fragmento de código, por ejemplo:La sugerencia de tipo no se aplica en los constructores de defrecord
user=> (defrecord Person [#^String name #^Integer age])
user.Person
user=> (seq (.getConstructors Person))
(#<Constructor public user.Person(java.lang.Object,java.lang.Object,
java.lang.Object,java.lang.Object)>
#<Constructor public user.Person(java.lang.Object,java.lang.Object)>)
user=> (Person. (Integer. 123) "abhinav")
#:user.Person{:name 123, :age "abhinav"}
Las firmas constructoras mostrados no coinciden con los consejos proporcionados tipo (utilizan tanto para Object
String
y Integer
) y yo soy capaz de construir objetos con los tipos de campo equivocadas.
¿Hay algún problema con mi código o es un error en Clojure?
Estoy en Clojure 1.2.0-beta1.
Como un lado, si su código depende de las características 1.2 de todos modos, debe preferir '^' a '# ^' para introducir metadatos del lector; el antiguo significado de '# ^' está en desuso en 1.2. –