Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust “a”是什么;“标称类型”;在固有实现的上下文中?_Rust - Fatal编程技术网

Rust “a”是什么;“标称类型”;在固有实现的上下文中?

Rust “a”是什么;“标称类型”;在固有实现的上下文中?,rust,Rust,我目前正在学习如何理解固有的实现。什么是“名义类型”,当他们说“与实现类型相关的项目”时,他们指的是什么 是否存在与C或C++相关的类比?< P>一个固有的实现等价于用OOP语言创建类。Rust的区别在于数据与实现是分开的: /* Data */ struct Foo { // all data there //... } /* Inherent implementation */ impl Foo { fn bar(&self) { //...

我目前正在学习如何理解固有的实现。什么是“名义类型”,当他们说“与实现类型相关的项目”时,他们指的是什么


是否存在与C或C++相关的类比?

< P>一个固有的实现等价于用OOP语言创建类。Rust的区别在于数据与实现是分开的:

/* Data */
struct Foo {
    // all data there
    //...
}

/* Inherent implementation */
impl Foo {
    fn bar(&self) {
        //...
    }
}
  • 标称类型是您实现的数据
  • 可关联项是您添加到数据中的方法。这些函数很特殊,因为您可以使用语法
    foo.bar()
    调用它们

与trait实现相反,内在实现被称为:

/* Data */
struct Foo {
    // all data there
    //...
}

/* Inherent implementation */
impl Foo {
    fn bar(&self) {
        //...
    }
}
<>在C++中,你不能将“固有实现”和“特征实现”分开(我把这些引用放在引用之间,因为那些术语在C++中是没有意义的)。

注意,与C++不同,在锈蚀中,方法并不是真正不同于自由函数。您可以像这样调用

bar
方法:

Foo::bar(foo);
如果定义此函数:

fn qux(f: &Foo) {
    //...
}

它将具有与
Foo::bar
相同的签名,这是语言参考。用它来学习英语当然是可能的,但有点像通过阅读字典来学习英语。你试过这个吗

无论如何,正如第一段所述,“名义类型”是:

impl /* --> */ Point /* <-- this is the "nominal type" */ {
    fn log(&self) { ... }
}
(作为旁白:段落中的代词(如“他”或“他”)将成为
impl
中的
self
self

impl
将这些项目与标称类型相关联。注意
HAIR
是如何在
Raymond
类型中“内部”的。您还可以将上述代码编写为:

struct Raymond;

const RAYMOND_HAIR: Colour = Colour::Brown;

fn raymond_dance(ray: &mut Raymond) { ... }

fn main() {
    let mut ray = Raymond;
    println!("Raymond's hair is {}", RAYMOND_HAIR);
    raymond_dance(&mut ray);
}
这里没有固有的
impl
s,因此
RAYMOND_HAIR
RAYMOND_dance
项目与
RAYMOND
类型没有直接关联。除了方便之外,两者之间没有根本区别

至于把这个绑定回C++…这是棘手的,因为锈区分固有和非固有的<代码> IMPL//COS> S和C++…不。最接近的类比是,它们就像

struct
主体的部分,不是字段,也不是基类中的重写方法

struct Raymond;

const RAYMOND_HAIR: Colour = Colour::Brown;

fn raymond_dance(ray: &mut Raymond) { ... }

fn main() {
    let mut ray = Raymond;
    println!("Raymond's hair is {}", RAYMOND_HAIR);
    raymond_dance(&mut ray);
}