在Python中,你可以做這樣的事情:Python的isinstance可以模擬或在Rust中使用嗎?
if isinstance("hello", basestring):
print "hello is a string"
else:
print "Not a string"
我的問題是可以這樣的代碼來重新創建或使用防鏽模仿?如果可能,這種檢查在Rust中是必需的還是有用的?
在Python中,你可以做這樣的事情:Python的isinstance可以模擬或在Rust中使用嗎?
if isinstance("hello", basestring):
print "hello is a string"
else:
print "Not a string"
我的問題是可以這樣的代碼來重新創建或使用防鏽模仿?如果可能,這種檢查在Rust中是必需的還是有用的?
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
)訪問該值。
你在Rust裏面有什麼可能是某種類型的東西,但是你不知道哪一個? –
@SebastianRedl,你不知道泛型參數具體的類型,例如有其他語言經驗的人可能希望編寫'fn foo(x:T){if T is String {...} else {...}}。 –
huon