teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

トレイト境界が不適切だったため修正する

2019/07/08 05:24

投稿

Eki
Eki

スコア429

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::BufRead,
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::BufRead,
48
+ U: std::io::Read,
49
49
  {
50
50
  let _ = f(x).bytes();
51
51
  }

1

別の結果を追記する

2019/07/08 05:24

投稿

Eki
Eki

スコア429

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
+ ```