Tengo lo siguiente:
let mut my_number = 32.90;
¿Cómo imprimo el tipo de my_number
?
Usando type
y type_of
no funcionó. ¿Hay alguna otra forma en que pueda imprimir el tipo de número?
Si simplemente desea averiguar el tipo de una variable y está dispuesto a hacerlo en el momento de la compilación, puede causar un error y hacer que el compilador lo recoja.
Por ejemplo, establezca la variable en un tipo que no funciona :
let mut my_number: () = 32.90;
// let () = x; would work too
error[E0308]: mismatched types
--> src/main.rs:2:29
|
2 | let mut my_number: () = 32.90;
| ^^^^^ expected (), found floating-point number
|
= note: expected type `()`
found type `{float}`
O llame a un método no válido :
let mut my_number = 32.90;
my_number.what_is_this();
error[E0599]: no method named `what_is_this` found for type `{float}` in the current scope
--> src/main.rs:3:15
|
3 | my_number.what_is_this();
| ^^^^^^^^^^^^
O acceda a un campo no válido :
let mut my_number = 32.90;
my_number.what_is_this
error[E0610]: `{float}` is a primitive type and therefore doesn't have fields
--> src/main.rs:3:15
|
3 | my_number.what_is_this
| ^^^^^^^^^^^^
Estos revelan el tipo, que en este caso en realidad no está completamente resuelto. Se llama "variable de punto flotante" en el primer ejemplo y " {float}
" en los tres ejemplos; Este es un tipo parcialmente resuelto que podría terminar f32
o f64
, dependiendo de cómo lo use. " {float}
" No es un nombre de tipo legal, es un marcador de posición que significa "No estoy completamente seguro de qué es", pero es un número de coma flotante. En el caso de las variables de punto flotante, si no lo restringe, el valor predeterminado será f64
¹. (Un literal entero no calificado estará predeterminado en i32
).
Ver también:
¹ Todavía puede haber formas de desconcertar al compilador para que no pueda decidir entre f32
y f64
; No estoy seguro. Solía ser tan simple como 32.90.eq(&32.90)
eso, pero eso trata tanto como f64
ahora y suena feliz, así que no lo sé.
:?
ha sido implementado manualmente durante bastante tiempo. Pero lo más importante, lastd::fmt::Debug
implementación (para eso es lo que:?
usa) para los tipos de números ya no incluye un sufijo para indicar de qué tipo es.ImageBuffer<_, Vec<_>>
que no me ayuda mucho cuando estoy tratando de escribir una función que tome una de estas cosas como parámetro. Y esto sucede en el código que de lo contrario se compila hasta que agregue el:()
. ¿No hay mejor manera?Hay una función inestable
std::intrinsics::type_name
que puede obtener el nombre de un tipo, aunque debe usar una compilación nocturna de Rust (es poco probable que funcione en Rust estable). Aquí hay un ejemplo:fuente
#![feature(core_intrinsics)]
print_type_of
está tomando referencias (&T
), no valores (T
), por lo que debe pasar en&&str
lugar de&str
; es decir, enprint_type_of(&"foo")
lugar deprint_type_of("foo")
.std::any::type_name
es estable desde el óxido 1.38: stackoverflow.com/a/58119924Puedes usar la
std::any::type_name
función. Esto no necesita un compilador nocturno o una caja externa, y los resultados son bastante correctos:Tenga cuidado: como se dice en la documentación, esta información debe usarse solo para fines de depuración:
Si desea que su representación de tipo permanezca igual entre las versiones del compilador, debe usar un rasgo, como en la respuesta del phicr .
fuente
Si conoce todos los tipos de antemano, puede usar rasgos para agregar un
type_of
método:Sin intrínsecos ni nada, por lo que, aunque más limitada,
esta es la única solución aquí que te da una cadena y es estable.(vea la respuesta de French Boiethios ) Sin embargo, es muy laborioso y no tiene en cuenta los parámetros de tipo, por lo que podríamos ...Vamos a usarlo:
salida:
Patio de óxido
fuente
UPD Lo siguiente ya no funciona. Verifique la respuesta de Shubham para su corrección.
Echa un vistazo
std::intrinsics::get_tydesc<T>()
. Está en estado "experimental" en este momento, pero está bien si solo está pirateando el sistema de tipos.Mira el siguiente ejemplo:
Esto es lo que se usa internamente para implementar el famoso
{:?}
formateador.fuente
** ACTUALIZACIÓN ** Esto no se ha verificado que funcione recientemente.
Junté una pequeña caja para hacer esto basada en la respuesta de vbo. Le da una macro para devolver o imprimir el tipo.
Ponga esto en su archivo Cargo.toml:
Entonces puedes usarlo así:
fuente
#![feature]
no se puede utilizar en el canal de liberación estable`También puede usar el enfoque simple de usar la variable en
println!("{:?}", var)
. SiDebug
no se implementa para el tipo, puede ver el tipo en el mensaje de error del compilador:( parque infantil )
Está sucio pero funciona.
fuente
Debug
no se implementa , este es un caso bastante poco probable. Una de las primeras cosas que debe hacer para la mayoría de las estructuras es agregar#[derive(Debug)]
. Creo que los tiempos en los que no quieresDebug
son muy pequeños.println!("{:?}", unknown_var);
? ¿Es una interpolación de cuerdas pero por qué:?
dentro de las llaves? @DenisKolodinDebug
porque no está implementado, pero también puedes usarlo{}
.Hay una respuesta @ChrisMorgan para obtener un tipo aproximado ("flotación") en óxido estable y hay una respuesta @ShubhamJain para obtener un tipo preciso ("f64") a través de una función inestable en óxido nocturno.
Ahora aquí hay una forma en que uno puede obtener el tipo preciso (es decir, decidir entre f32 y f64) en óxido estable:
resultados en
Actualizar
La variación del turbocebo
es ligeramente más corto pero algo menos legible.
fuente
float
, decir entref32
yf64
se puede lograr constd::mem::size_of_val(&a)
Algunas otras respuestas no funcionan, pero me parece que el nombre de tipo cajón funciona.
Crea un nuevo proyecto:
Modificar el Cargo.toml
Modifica tu código fuente
El resultado es:
fuente
typename
no funciona con variables sin tipo explícito en la declaración. Ejecutarlomy_number
desde la pregunta da el siguiente error "no se puede llamar al métodotype_name_of
en tipo numérico ambiguo{float}
. Ayuda: debe especificar un tipo para este enlace, comof32
"0.65
y funciona bien:type of c 0.65 0.65 is f64
. Aquí está mi versión:rustc 1.38.0-nightly (69656fa4c 2019-07-13)
Si solo quiere saber el tipo de su variable durante el desarrollo interactivo, le recomiendo usar rls (servidor de lenguaje de óxido) dentro de su editor o ide. Luego, puede habilitar o alternar permanentemente la capacidad de desplazamiento y simplemente colocar el cursor sobre la variable. Debería aparecer un pequeño cuadro de diálogo con información sobre la variable, incluido el tipo.
fuente