質問編集履歴

2

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

2019/07/08 05:24

投稿

Eki
Eki

スコア429

test CHANGED
File without changes
test CHANGED
@@ -76,7 +76,7 @@
76
76
 
77
77
  where
78
78
 
79
- &'a mut T: std::io::BufRead,
79
+ &'a mut T: std::io::Read,
80
80
 
81
81
  {
82
82
 
@@ -92,7 +92,7 @@
92
92
 
93
93
  where
94
94
 
95
- U: std::io::BufRead,
95
+ U: std::io::Read,
96
96
 
97
97
  {
98
98
 

1

別の結果を追記する

2019/07/08 05:24

投稿

Eki
Eki

スコア429

test CHANGED
File without changes
test CHANGED
@@ -57,3 +57,47 @@
57
57
 
58
58
 
59
59
  Rust では、トレイトに定義されているメソッドを (Fully Qualified Path を使わず) 呼び出す際は基本的にそのトレイトが use によってスコープに持ち込まれている必要があります。ところがこれにはいくつか例外があるように見えます。上の例では、境界にトレイトが指定されているような型の変数とトレイトオブジェクト `Box<dyn Trait>` については `use` せずに使えることが示されています。なぜ `impl Trait` についてはこうならないのでしょうか。
60
+
61
+
62
+
63
+ **追記**
64
+
65
+
66
+
67
+ トレイト境界が明記してあっても単純 (?) なものでないとダメなようです。
68
+
69
+
70
+
71
+ ```rust
72
+
73
+ // Error
74
+
75
+ fn foo<'a, T, F: FnOnce(&'a mut T) -> &'a mut T>(x: &'a mut T, f: F)
76
+
77
+ where
78
+
79
+ &'a mut T: std::io::BufRead,
80
+
81
+ {
82
+
83
+ let _ = f(x).bytes();
84
+
85
+ }
86
+
87
+
88
+
89
+ // OK
90
+
91
+ fn bar<'a, T, U, F: FnOnce(&'a mut T) -> U>(x: &'a mut T, f: F)
92
+
93
+ where
94
+
95
+ U: std::io::BufRead,
96
+
97
+ {
98
+
99
+ let _ = f(x).bytes();
100
+
101
+ }
102
+
103
+ ```