Utworzono typ za pomocą defrecord
z podpowiedziami do pól. Jednak zauważyłem, że wskazówki tego typu nie są wymuszane w konstruktorach i mogę wykonywać z nimi dziwne rzeczy. Spójrz na poniższym fragmencie na przykład:Podpowiedzi typów nie są wymuszane w konstruktorach 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"}
Podpisy konstruktora pokazane nie zgadzają się z podpowiedzi typu świadczonych (używają Object
zarówno String
i Integer
) i jestem w stanie zbudować obiekty z niewłaściwych typów pól.
Czy jest coś nie tak z moim kodem lub jest to błąd w Clojure?
Jestem na Clojure 1.2.0-beta1.
Na marginesie, jeśli Twój kod zależy od funkcji 1.2, powinieneś preferować '^' do '# ^' do wprowadzania metadanych czytnika; stare znaczenie wyrażenia "# ^" jest przestarzałe w wersji 1.2. –