2016-01-15 2 views
0

В Python вы можете сделать что-то вроде этого:Можно ли эмулировать или использовать Python в Rust?

if isinstance("hello", basestring): 
    print "hello is a string" 
else: 
    print "Not a string" 

Мой вопрос может этот вид кода заново или эмулировать с помощью Rust? Если это возможно, является ли такая проверка необходимой или полезной в Rust?

+4

Что у вас есть в Rust, который может быть каким-то типом, но вы не знаете, какой из них? –

+0

@SebastianRedl, вы не знаете, какой конкретный тип имеет общий параметр, например. кто-то с опытом других языков, возможно, захочет написать 'fn foo (x: T) {если T является String {...} else {...}}'. – huon

ответ

4

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.

4

Ржавчина имеет ограниченную для понижающего приведения, которое может быть обеспечено Any: вы можете Any запросить ли конкретный тип X или Y.


Полезность конструкции довольно ограничена; Ржавчина является статически типизированный язык так в большинстве ситуации вы:

  • либо знать точный конкретный тип
  • или использовать trait, который имеет достаточные методы для ваших нужд

еще, Крис Морган разработал AnyMap, например, для хранения одного значения каждого типа, не зная упомянутых типов a-priori, которые затем он использовал для предоставления типизированного интерфейса HTTP-заголовкам без ограничения набора заголовков на известный набор.

Смежные вопросы