質問編集履歴
2
トレイト境界が不適切だったため修正する
title
CHANGED
File without changes
|
body
CHANGED
@@ -37,7 +37,7 @@
|
|
37
37
|
// Error
|
38
38
|
fn foo<'a, T, F: FnOnce(&'a mut T) -> &'a mut T>(x: &'a mut T, f: F)
|
39
39
|
where
|
40
|
-
&'a mut T: std::io::
|
40
|
+
&'a mut T: std::io::Read,
|
41
41
|
{
|
42
42
|
let _ = f(x).bytes();
|
43
43
|
}
|
@@ -45,7 +45,7 @@
|
|
45
45
|
// OK
|
46
46
|
fn bar<'a, T, U, F: FnOnce(&'a mut T) -> U>(x: &'a mut T, f: F)
|
47
47
|
where
|
48
|
-
U: std::io::
|
48
|
+
U: std::io::Read,
|
49
49
|
{
|
50
50
|
let _ = f(x).bytes();
|
51
51
|
}
|
1
別の結果を追記する
title
CHANGED
File without changes
|
body
CHANGED
@@ -27,4 +27,26 @@
|
|
27
27
|
}
|
28
28
|
```
|
29
29
|
|
30
|
-
Rust では、トレイトに定義されているメソッドを (Fully Qualified Path を使わず) 呼び出す際は基本的にそのトレイトが use によってスコープに持ち込まれている必要があります。ところがこれにはいくつか例外があるように見えます。上の例では、境界にトレイトが指定されているような型の変数とトレイトオブジェクト `Box<dyn Trait>` については `use` せずに使えることが示されています。なぜ `impl Trait` についてはこうならないのでしょうか。
|
30
|
+
Rust では、トレイトに定義されているメソッドを (Fully Qualified Path を使わず) 呼び出す際は基本的にそのトレイトが use によってスコープに持ち込まれている必要があります。ところがこれにはいくつか例外があるように見えます。上の例では、境界にトレイトが指定されているような型の変数とトレイトオブジェクト `Box<dyn Trait>` については `use` せずに使えることが示されています。なぜ `impl Trait` についてはこうならないのでしょうか。
|
31
|
+
|
32
|
+
**追記**
|
33
|
+
|
34
|
+
トレイト境界が明記してあっても単純 (?) なものでないとダメなようです。
|
35
|
+
|
36
|
+
```rust
|
37
|
+
// Error
|
38
|
+
fn foo<'a, T, F: FnOnce(&'a mut T) -> &'a mut T>(x: &'a mut T, f: F)
|
39
|
+
where
|
40
|
+
&'a mut T: std::io::BufRead,
|
41
|
+
{
|
42
|
+
let _ = f(x).bytes();
|
43
|
+
}
|
44
|
+
|
45
|
+
// OK
|
46
|
+
fn bar<'a, T, U, F: FnOnce(&'a mut T) -> U>(x: &'a mut T, f: F)
|
47
|
+
where
|
48
|
+
U: std::io::BufRead,
|
49
|
+
{
|
50
|
+
let _ = f(x).bytes();
|
51
|
+
}
|
52
|
+
```
|