У меня есть следующее:
let mut my_number = 32.90;
Как мне распечатать тип my_number
?
Использование type
и type_of
не работает. Есть ли другой способ, которым я могу напечатать тип номера?
Если вы просто хотите узнать тип переменной и хотите сделать это во время компиляции, вы можете вызвать ошибку и заставить компилятор ее забрать.
Например, установите для переменной тип, который не работает :
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}`
Или вызовите неверный метод :
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();
| ^^^^^^^^^^^^
Или получите доступ к неверному полю :
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
| ^^^^^^^^^^^^
Они показывают тип, который в этом случае фактически не полностью решен. Она называется «переменная с плавающей точкой» в первом примере и « {float}
» во всех трех примерах; это частично разрешенный тип, который может закончиться f32
или f64
, в зависимости от того, как вы его используете. « {float}
» Не является имя правового типа, это означает заполнитель «Я не совсем уверен , что это», но это число с плавающей точкой. В случае переменных с плавающей точкой, если вы не ограничиваете его, по умолчанию оно будет равно f64
¹. (Неполный целочисленный литерал будет по умолчанию i32
.)
Смотрите также:
Still Могут существовать способы сбить с толку компилятор, чтобы он не мог выбрать между f32
и f64
; Я не уверен. Раньше все было так же просто 32.90.eq(&32.90)
, но к этому f64
относились как сейчас, так и к счастью, так что я не знаю.
:?
в течение довольно долгого времени был реализован вручную. Но что более важно,std::fmt::Debug
реализация (для этого и:?
используется) для числовых типов больше не включает суффикс, указывающий, к какому типу он относится.ImageBuffer<_, Vec<_>>
что мне не очень поможет, когда я пытаюсь написать функцию, которая принимает одну из этих вещей в качестве параметра. И это происходит в коде, который в противном случае компилируется, пока я не добавлю:()
. Нет лучшего способа?Существует нестабильная функция,
std::intrinsics::type_name
которая может дать вам имя типа, хотя вы должны использовать ночную сборку Rust (это вряд ли когда-либо будет работать в стабильном Rust). Вот пример:источник
#![feature(core_intrinsics)]
print_type_of
принимает ссылки (&T
), а не значения (T
), поэтому вы должны передать,&&str
а не&str
; то есть,print_type_of(&"foo")
а неprint_type_of("foo")
.std::any::type_name
стабильна с момента ржавчины 1.38: stackoverflow.com/a/58119924Вы можете использовать
std::any::type_name
функцию. Для этого не нужен ночной компилятор или внешний ящик, и результаты вполне корректны:Будьте осторожны: как сказано в документации, эта информация должна использоваться только для целей отладки:
Если вы хотите, чтобы ваше представление типов оставалось неизменным между версиями компилятора, вы должны использовать черту, как в ответе phicr .
источник
Если вы заранее знаете все типы, вы можете использовать черты для добавления
type_of
метода:Никаких интрижек или ничего, поэтому, хотя и более ограниченный,
это единственное решение, которое дает вам строку и является стабильным.(см . ответ французского Boiethios ) Однако, это очень трудоемко и не учитывает параметры типа, поэтому мы могли бы ...Давайте использовать это:
вывод:
Rust Playground
источник
UPD Следующее больше не работает. Проверьте ответ Shubham для исправления.
Проверьте
std::intrinsics::get_tydesc<T>()
. Сейчас он находится в «экспериментальном» состоянии, но это нормально, если вы просто взламываете систему типов.Посмотрите на следующий пример:
Это то, что используется внутри для реализации известного средства
{:?}
форматирования.источник
** ОБНОВЛЕНИЕ ** Это не было проверено, чтобы работать в последнее время.
Я собрал небольшой ящик, чтобы сделать это, основываясь на ответе VBO. Это дает вам макрос для возврата или распечатки типа.
Поместите это в ваш файл Cargo.toml:
Тогда вы можете использовать его так:
источник
#![feature]
нельзя использовать на канале стабильного выпуска`Вы также можете использовать простой подход использования переменной в
println!("{:?}", var)
. ЕслиDebug
это не реализовано для типа, вы можете увидеть тип в сообщении об ошибке компилятора:( детский манеж )
Это грязно, но это работает.
источник
Debug
не реализовано - это довольно маловероятный случай. Одна из первых вещей, которую вы должны сделать для большинства структур - это добавить#[derive(Debug)]
. Я думаю, что времена, когда вы не хотитеDebug
, очень малы.println!("{:?}", unknown_var);
?? Это интерполяция строк, но почему:?
внутри фигурных скобок? @DenisKolodinDebug
потому что это не реализовано, но вы также можете использовать{}
.Есть ответ @ChrisMorgan, чтобы получить приблизительный тип ("float") в стабильной ржавчине, и есть ответ @ShubhamJain чтобы получить точный тип ("f64") через нестабильную функцию в ночной ржавчине.
Теперь вот как можно получить точный тип (т.е. выбрать между f32 и f64) в стабильной ржавчине:
результаты в
Обновить
Турбо-рыбная вариация
немного короче, но несколько менее читабельно.
источник
float
, говоря междуf32
иf64
может быть достигнуто сstd::mem::size_of_val(&a)
Некоторые другие ответы не работают, но я обнаружил, что ящик с типом работает.
Создайте новый проект:
Изменить Cargo.toml
Изменить ваш исходный код
Выход:
источник
typename
не работает с переменными без явного типа в объявлении. Запуск егоmy_number
из вопроса дает следующую ошибку: «не удается вызвать методtype_name_of
для неоднозначного числового типа{float}
.f32
0.65
и это хорошо работаетtype of c 0.65 0.65 is f64
. вот моя версия:rustc 1.38.0-nightly (69656fa4c 2019-07-13)
Если вы просто хотите знать тип вашей переменной во время интерактивной разработки, я настоятельно рекомендую использовать rls (сервер языка ржавчины) внутри вашего редактора или ide. Затем вы можете просто включить или отключить возможность наведения и просто навести курсор на переменную. В небольшом диалоге должна появиться информация о переменной, включая тип.
источник