考虑以下代码:
let s = String::from("hello");
let mut r = String::new();
for c in s.chars() {
r.push(c);
}
作为
&str
的方法,为什么String
可以调用chars
方法呢?我想这可能与coercion
(强制类型转换)有关,但是我并不完全理解这个隐式转换。考虑以下代码:
let s = String::from("hello");
let mut r = String::new();
for c in s.chars() {
r.push(c);
}
&str
的方法,为什么String
可以调用chars
方法呢?我想这可能与coercion
(强制类型转换)有关,但是我并不完全理解这个隐式转换。U
(即,设置U = T
,然后U = *T
,...)bar
,其接收者类型(方法中的self
的类型)与U
完全匹配,则使用它(一个“按值传递方法”)&
或&mut
的接收者),如果某个方法的接收者与&U
匹配,则使用它(一个“自动引用方法”)U = *T
意味着 let u = Deref::deref(t);
,其中 u: U
,t: T
。我们一直这样做,直到无法再取消引用为止。s.chars()
调用进行如下处理:
String::chars(s)
吗?不能。&String
或者 &mut String
呢?也不行。<String as Deref>::Target = str
,因此我们正在查找 str
的方法。 let c: str = *s
(假设允许该 DST 类型);
str::chars(c)
吗?不能。str::chars(&c)
吗?可以!