簡體   English   中英

Rust是否具有所有實體“繼承”或實現的類型或特征?

[英]Does Rust have a type or trait that all entities “inherit” or implement?

在Java中,所有對象都繼承自java.lang.Object 在Go中,所有類型/結構都實現空接口interface {} Rust語言中是否有類似的結構?

如果答案是否定的,那是什么讓它變得沒必要? 是因為Rust中的所有實體(模塊除外)都可以按類型參數化嗎? 這是否消除了對所有Rust實體/結構/枚舉共享的共同“超類型”或共同特征的需求?

是的,有一個特點。 它是std::any::Any

來自文檔

Any特性由所有'靜態類型實現,可用於動態類型

我理解它的方式,如果不是完全沒必要的話,在Rust中沒有必要有基類型。

請注意,參數多態(泛型)的引入已經在java中刪除了Object大多數用例。 使用Object您可以實現可以使用任何類型的Java類型的“通用”方法。 另一方面,當你有一個Object你無法對它做太多的事情......你必須將它強制轉換回實際的子類型才能使用它。

例如,舊的非泛型版本的Java集合使用了Object ,這意味着您必須像這樣工作(樣本直接來自Oracle網站上的這篇文章 ):

LinkedList list = new LinkedList();
list.add(new Integer(1));
Integer num = (Integer) list.get(0);

add需要一個Object (所以你可以使用任何類型的集合)。 但是get返回一個Object ,因此你必須根據你(程序員)對你最初在LinkedList中插入的內容的知識將它強制轉換回Integer 這里的類型安全性很小。

從java 1.5開始,同一容器的新通用版本是:

LinkedList<Integer> list = new LinkedList<Integer>();
list.add(new Integer(1));
Integer num = list.get(0);

現在你有一個Integer列表,所以add需要Integerget返回Integer Object無處可見(盡管由於類型擦除它就在那里,幾乎躲在引擎蓋下......)

注意,Go對interface{}的主要用途源於Go沒有泛型的事實。 interface{}的主要使用模式大致相同。 當你必須使用多種類型時,你可以使用它,並且在使用之前將它( 盡管以更安全的方式更優雅的模式 )轉換回更有用的類型。

考慮到這一點,理論上你可以以相同的方式使用Rust中的Any (在使用之前檢查實際類型並轉換為它)。 只是你可能找不到很多可能有用的案例。 下面的代碼適用於rustc 0.13-nightly(2015-01-01),雖然我確信有更好的方法來編寫它...

use std::any::{Any, AnyRefExt};

// just a couple of random types
struct Foo {
    a: f64
}

enum Bar {
    Baz(int),
    Qux
}

fn main() {
    // create an array of things that could have any type
    let anything = &[&1i as &Any, &Foo{a: 2.} as &Any, &Bar::Qux as &Any];

    // iterate and print only the integer
    for &any in anything.iter() {
        if any.is::<int>() { // check if type is int
            match any.downcast_ref::<int>() { // cast to int
                Some(a) => { println!("{}", *a); }
                None => panic!()
            }
            // or just (shorter version of the match)
            println!("{}", *any.downcast_ref::<int>().unwrap());
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM