Python динамически типизирован. Когда вы пишете, например, функцию def foo(x):
, вызывающий может выбрать, чтобы указать значение любого типа в качестве параметра x
. Вот почему Python имеет isinstance()
, так что вы можете проверить, когда это важно.
Ржавчина статически типизирована. Любая переменная в коде имеет тип, который известен во время компиляции. Для параметров функций вам необходимо написать это явно: fn foo(x: String) {
. Для локальных переменных вы можете написать его: let x: String = something();
или оставить его в поле ввода компилятора, чтобы выяснить: let x = something();
на основе другой информации (здесь, на основе типа возврата something()
). Иногда не хватает контекста для вывода типа, и вы должны писать явное аннотирование типа.
Если все имеет известный тип, функция isinstance
, которая возвращает true или false, не имеет смысла. Так что у Руста нет такого.
Обратите внимание, что некоторые формы динамического ввода можно с чертой объектов и Any
черта:
Таким образом, вы можете написать:
fn foo(object: &Any) {
if object.is::<String>() {
// ...
}
}
object
s тип еще статичный: это &Any
. Но это также представляет значение какого-либо другого, произвольного типа. Вы можете получить доступ к этому значению с помощью других методов Any
, таких как downcast_ref
.
Что у вас есть в Rust, который может быть каким-то типом, но вы не знаете, какой из них? –
@SebastianRedl, вы не знаете, какой конкретный тип имеет общий параметр, например. кто-то с опытом других языков, возможно, захочет написать 'fn foo (x: T) {если T является String {...} else {...}}'. –
huon