Saya memiliki yang berikut ini:
let mut my_number = 32.90;
Bagaimana cara saya mencetak jenis my_number
?
Menggunakan type
dan type_of
tidak berhasil. Apakah ada cara lain untuk mencetak jenis nomor itu?
Jika Anda hanya ingin mengetahui jenis variabel dan bersedia melakukannya pada waktu kompilasi, Anda dapat menyebabkan kesalahan dan meminta kompilator untuk mengambilnya.
Misalnya, atur variabel ke tipe yang tidak berfungsi :
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}`
Atau hubungi metode yang tidak valid :
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();
| ^^^^^^^^^^^^
Atau akses bidang yang tidak valid :
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
| ^^^^^^^^^^^^
Ini mengungkapkan jenis, yang dalam hal ini sebenarnya tidak sepenuhnya diselesaikan. Ini disebut "variabel titik-mengambang" pada contoh pertama, dan " {float}
" dalam ketiga contoh; ini adalah jenis yang diselesaikan sebagian yang bisa berakhir f32
atau f64
, tergantung pada bagaimana Anda menggunakannya. " {float}
" Bukan nama jenis hukum, ini adalah placeholder yang berarti "Saya tidak sepenuhnya yakin apa ini", tetapi ini adalah angka floating-point. Dalam kasus variabel floating-point, jika Anda tidak membatasi itu, itu akan default ke f64
¹. (Literal integer yang tidak berkualitas akan default ke i32
.)
Lihat juga:
¹ Mungkin masih ada cara membingungkan penyusun sehingga tidak bisa memutuskan antara f32
dan f64
; Saya tidak yakin. Dulu sesederhana itu 32.90.eq(&32.90)
, tetapi itu memperlakukan baik seperti f64
sekarang dan bersama-sama bahagia, jadi saya tidak tahu.
:?
telah cukup lama sekarang telah diimplementasikan secara manual. Tetapi yang lebih penting,std::fmt::Debug
implementasi (untuk itulah yang:?
digunakan) untuk tipe angka tidak lagi menyertakan akhiran untuk menunjukkan tipe yang mana.ImageBuffer<_, Vec<_>>
yang tidak banyak membantu saya ketika saya mencoba menulis fungsi yang menggunakan salah satu dari hal-hal ini sebagai parameter. Dan ini terjadi dalam kode yang jika tidak dikompilasi sampai saya menambahkan:()
. Apakah tidak ada cara yang lebih baik?Ada fungsi
std::intrinsics::type_name
yang tidak stabil yang bisa membuat Anda mendapatkan nama suatu tipe, meskipun Anda harus menggunakan build malam hari Rust (ini tidak mungkin bekerja di Rust yang stabil). Ini sebuah contoh:sumber
#![feature(core_intrinsics)]
print_type_of
mengambil referensi (&T
), bukan nilai (T
), jadi Anda harus lulus&&str
daripada&str
; itu,print_type_of(&"foo")
bukannyaprint_type_of("foo")
.std::any::type_name
stabil sejak karat 1.38: stackoverflow.com/a/58119924Anda dapat menggunakan
std::any::type_name
fungsi ini. Ini tidak memerlukan kompiler malam atau peti eksternal, dan hasilnya cukup benar:Diperingatkan: seperti yang disebutkan dalam dokumentasi, informasi ini harus digunakan hanya untuk tujuan debug:
Jika Anda ingin representasi tipe Anda tetap sama di antara versi kompiler, Anda harus menggunakan sifat, seperti dalam jawaban phicr .
sumber
Jika Anda tahu semua tipe sebelumnya, Anda bisa menggunakan ciri untuk menambahkan
type_of
metode:Tidak ada intrik atau apa pun, jadi meskipun lebih terbatas
ini adalah satu-satunya solusi di sini yang memberi Anda string dan stabil.(lihat jawaban French Boiethios ) Namun, ini sangat melelahkan dan tidak memperhitungkan parameter tipe, sehingga kami dapat ...Mari kita gunakan:
keluaran:
Taman Bermain Karat
sumber
UPD Berikut ini tidak berfungsi lagi. Periksa jawaban Shubham untuk koreksi.
Lihat
std::intrinsics::get_tydesc<T>()
. Ini dalam keadaan "eksperimental" sekarang, tetapi tidak apa-apa jika Anda hanya meretas sistem tipe.Lihat contoh berikut:
Inilah yang digunakan secara internal untuk mengimplementasikan
{:?}
formatter yang terkenal .sumber
** PEMBARUAN ** Ini belum diverifikasi untuk berfungsi kapan saja.
Saya mengumpulkan peti kecil untuk melakukan ini berdasarkan jawaban vbo. Ini memberi Anda makro untuk mengembalikan atau mencetak jenis.
Masukkan ini ke file Cargo.toml Anda:
Maka Anda dapat menggunakannya seperti ini:
sumber
#![feature]
tidak dapat digunakan pada saluran rilis stabil`Anda juga dapat menggunakan pendekatan sederhana menggunakan variabel dalam
println!("{:?}", var)
. JikaDebug
tidak diterapkan untuk tipe, Anda bisa melihat tipe dalam pesan kesalahan kompiler:( playpen )
Itu kotor tapi berhasil.
sumber
Debug
tidak diterapkan - ini adalah kasus yang sangat tidak mungkin. Salah satu hal pertama yang harus Anda lakukan untuk sebagian besar struct adalah menambahkan#[derive(Debug)]
. Saya pikir waktu di mana Anda tidak inginDebug
sangat kecil.println!("{:?}", unknown_var);
?? Apakah ini interpolasi string tetapi mengapa bagian:?
dalam kurung keriting? @DenisKolodinDebug
karena tidak diimplementasikan, tetapi Anda dapat menggunakannya{}
juga.Ada jawaban @ChrisMorgan untuk mendapatkan tipe perkiraan ("float") dalam karat yang stabil dan ada jawaban @ShubhamJain untuk mendapatkan tipe yang tepat ("f64") melalui fungsi yang tidak stabil pada karat malam.
Sekarang inilah cara orang bisa mendapatkan tipe yang tepat (yaitu memutuskan antara f32 dan f64) dalam karat stabil:
hasil dalam
Memperbarui
Variasi turbofish
sedikit lebih pendek tetapi agak kurang mudah dibaca.
sumber
float
, mengatakan di antaraf32
danf64
dapat dicapai denganstd::mem::size_of_val(&a)
Beberapa jawaban lain tidak berfungsi, tetapi saya menemukan bahwa kotak ketik berfungsi.
Buat proyek baru:
Ubah Cargo.toml
Ubah kode sumber Anda
Outputnya adalah:
sumber
typename
tidak bekerja dengan variabel tanpa tipe eksplisit dalam deklarasi. Menjalankannya denganmy_number
dari pertanyaan memberikan kesalahan berikut "tidak dapat memanggil metodetype_name_of
pada tipe numerik yang ambigu{float}
. Bantuan: Anda harus menentukan tipe untuk pengikatan ini, sepertif32
"0.65
dan bekerja dengan baik:type of c 0.65 0.65 is f64
. di sini adalah versi saya:rustc 1.38.0-nightly (69656fa4c 2019-07-13)
Jika Anda hanya ingin tahu jenis variabel Anda selama pengembangan interaktif, saya akan sangat menyarankan menggunakan rls (server bahasa karat) di dalam editor atau ide Anda. Anda kemudian dapat secara permanen mengaktifkan atau mengaktifkan kemampuan melayang dan cukup meletakkan kursor Anda di atas variabel. Sebuah dialog kecil akan muncul dengan informasi tentang variabel termasuk jenisnya.
sumber