2016-01-15 34 views
0

在Python中,你可以做這樣的事情:Python的isinstance可以模擬或在Rust中使用嗎?

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

我的問題是可以這樣的代碼來重新創建或使用防鏽模仿?如果可能,這種檢查在Rust中是必需的還是有用的?

+4

你在Rust裏面有什麼可能是某種類型的東西,但是你不知道哪一個? –

+0

@SebastianRedl,你不知道泛型參數具體的類型,例如有其他語言經驗的人可能希望編寫'fn foo (x:T){if T is String {...} else {...}}。 – huon

回答

4

Python是動態輸入的。當您編寫例如函數def foo(x):時,調用者可以選擇給出任何類型的值作爲參數x。這就是爲什麼Python有isinstance(),所以你可以檢查它的重要性。

生鏽是靜態類型。代碼中的任何變量都有一個在編譯時已知的類型。對於函數參數,您必須明確寫入:fn foo(x: String) {。對於局部變量,您可以編寫它:let x: String = something();或將其留給編譯器的類型推斷以根據其他信息(此處基於返回類型something())找出:let x = something();。有時候沒有足夠的上下文進行類型推斷,你必須編寫一個明確的類型註釋。

如果所有東西都有已知類型,則返回true或false的isinstance函數沒有意義。所以Rust沒有一個。

需要注意的是某種形式的動態類型是可能的特質對象和Any特點:

所以你可以這樣寫:

fn foo(object: &Any) { 
    if object.is::<String>() { 
     // ... 
    } 
} 

object S型仍是靜態的:它是&Any。但它也代表一些其他任意類型的值。您可以使用其他Any方法(如downcast_ref)訪問該值。

4

Rust對於向下傾斜有限制,可以通過Any提供:您可以Any查詢具體類型是X還是Y


雖然構造的有用性相當有限,鏽病是一種靜態類型語言,所以在大多數情況下,你:

  • 要麼知道確切的具體類型
  • 或使用trait有適合您的需求
  • 足夠的方法

的是,克里斯·摩根開發的AnyMap例如存儲每個類型的一個值,而不先知道所述類型,然後他用它向HTTP標題提供類型化的接口,而不用將該組標題限制到已知集合。

相關問題