繁体   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