2010-01-06 3 views
23

Sto imparando il clojure e ho una domanda molto basilare: dato che il clojure ha inferenza di tipo, come puoi dire quale classe è stata dedotta?Verifica la classe di qualcosa in clojure?

Per esempio, questi sarebbero ogni risultato in diversi tipi di dati:

(2) 
(/ 2 3) 
(/ 2.0 3) 

C'è una sorta di class funzione che restituisce il tipo di dati? Inoltre, c'è un modo normale di trasmettere qualcosa per essere un tipo specifico? Quindi nel secondo esempio sopra, cosa farei se volessi che il risultato sia float?

risposta

32

C'è una funzione type nella libreria clojure.core.

user> (type 2) 
java.lang.Integer 

user> (type (/ 2 3)) 
clojure.lang.Ratio 

user> (type (/ 2.0 3)) 
java.lang.Double 

Se si desidera convertire un numero dato in un float quindi utilizzare float.

user> (float 10) 
10.0 
+1

Dang! 'type' non è nel Clojure Cheat Sheet () quindi non l'ho trovato :( –

+7

C'è anche' class'. 'type' controlla fondamentalmente i metadati (se c'è) prima per la chiave: type, quindi come 'classe' di fallback. – kotarak

+0

Molto vero! È anche molto utile. – aatifh

2

Allo stesso modo non si può avere bisogno di gettare perché i seguenti lavori:

user> (Double/toString (/ 2 3)) 
"0.6666666666666667" 

Tuttavia, questo non troppo:

user> (str (/ 2 3)) 
"0.6666666666666667"