|
|
@ -159,7 +159,7 @@ error[E0277]: the trait bound `&mut i32: Trait` is not satisfied
|
|
|
|
#### 点操作符
|
|
|
|
#### 点操作符
|
|
|
|
方法调用的点操作符看起来简单,实际上非常不简单,它在调用时,会发生很多魔法般的类型转换,例如:自动引用、自动解引用,强制类型转换直到类型能匹配等。
|
|
|
|
方法调用的点操作符看起来简单,实际上非常不简单,它在调用时,会发生很多魔法般的类型转换,例如:自动引用、自动解引用,强制类型转换直到类型能匹配等。
|
|
|
|
|
|
|
|
|
|
|
|
假设有一个方法`foo`,它有一个接收器(接收器就是`self`、`&sef`、`&mut self`参数)。如果调用`value.foo()`,编译器在调用`foo`之前,需要决定到底使用哪个`Self`类型来调用。现在假设`value`拥有类型`T`.
|
|
|
|
假设有一个方法`foo`,它有一个接收器(接收器就是`self`、`&self`、`&mut self`参数)。如果调用`value.foo()`,编译器在调用`foo`之前,需要决定到底使用哪个`Self`类型来调用。现在假设`value`拥有类型`T`.
|
|
|
|
|
|
|
|
|
|
|
|
再进一步,我们使用[完全限定语法](https://course.rs/basic/trait/advance-trait.html#完全限定语法)来进行准确的函数调用:
|
|
|
|
再进一步,我们使用[完全限定语法](https://course.rs/basic/trait/advance-trait.html#完全限定语法)来进行准确的函数调用:
|
|
|
|
1. 首先,编译器检查它是否可以直接调用`T::foo(value)`, 称之为**值方法调用**
|
|
|
|
1. 首先,编译器检查它是否可以直接调用`T::foo(value)`, 称之为**值方法调用**
|
|
|
@ -267,6 +267,6 @@ impl<T> Clone for Container<T> {
|
|
|
|
|
|
|
|
|
|
|
|
你以为你之前凝视的是深渊吗?不,你凝视的只是深渊的大门。`mem::transmute_copy<T, U>`才是真正的深渊,它比之前的还要更加危险和不安全。它从`T`类型中拷贝出`U`类型所需的字节数,然后转换成`U`。`mem::transmute`尚有大小检查,能保证两个数据的内存大小一致,现在这哥们干脆连这个也丢了,只不过`U`的尺寸若是比`T`大,会是一个未定义行为。
|
|
|
|
你以为你之前凝视的是深渊吗?不,你凝视的只是深渊的大门。`mem::transmute_copy<T, U>`才是真正的深渊,它比之前的还要更加危险和不安全。它从`T`类型中拷贝出`U`类型所需的字节数,然后转换成`U`。`mem::transmute`尚有大小检查,能保证两个数据的内存大小一致,现在这哥们干脆连这个也丢了,只不过`U`的尺寸若是比`T`大,会是一个未定义行为。
|
|
|
|
|
|
|
|
|
|
|
|
当然,你也可以通过原生指针转换获得`unions`(todo!)获得所有的这些功能,但是你将无法获得任何编译提示或者检查。原生指针转换和`unions`也不是魔法,无法逃避上面说的规则。
|
|
|
|
当然,你也可以通过原生指针转换和`unions`(todo!)获得所有的这些功能,但是你将无法获得任何编译提示或者检查。原生指针转换和`unions`也不是魔法,无法逃避上面说的规则。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|