回答編集履歴
3
誤字などを修正しました
answer
CHANGED
@@ -45,7 +45,7 @@
|
|
45
45
|
正しい使い方は、まずクロージャを定義して変数から束縛します。
|
46
46
|
|
47
47
|
```rust
|
48
|
-
let power_of_two = |
|
48
|
+
let power_of_two = |i| {
|
49
49
|
let mut x: i128 = 1;
|
50
50
|
for _ in 0..i {
|
51
51
|
x *= 2;
|
@@ -138,4 +138,4 @@
|
|
138
138
|
|
139
139
|
Rustに慣れてきたら、こういう書き方にも挑戦してみてください。
|
140
140
|
|
141
|
-
あと
|
141
|
+
あと`i128`型ですが、64ビットのCPUでは直接計算できず、ソフトウェアで計算することになりますので計算が遅いです。もし可能ならCPUが直接計算できる`i64`や`u64`などを使うのがおすすめです。
|
2
map()などでもっと簡潔に書ける方法を追記しました
answer
CHANGED
@@ -99,4 +99,43 @@
|
|
99
99
|
128
|
100
100
|
256
|
101
101
|
512
|
102
|
-
```
|
102
|
+
```
|
103
|
+
|
104
|
+
### 追記
|
105
|
+
|
106
|
+
余談になりますがイテレータの`map()`と`collect()`を使うと、2つ目の`for`が簡潔に書けます。
|
107
|
+
|
108
|
+
```rust
|
109
|
+
fn main() {
|
110
|
+
let power_of_two = |i| {
|
111
|
+
let mut x: i128 = 1;
|
112
|
+
for _ in 0..i {
|
113
|
+
x *= 2;
|
114
|
+
}
|
115
|
+
x
|
116
|
+
};
|
117
|
+
|
118
|
+
let v = (0..10).map(power_of_two).collect::<Vec<i128>>();
|
119
|
+
|
120
|
+
for i in v {
|
121
|
+
println!("{}", i);
|
122
|
+
}
|
123
|
+
}
|
124
|
+
```
|
125
|
+
|
126
|
+
さらに1つ目の`for`も`fold()`で置き換えられます。
|
127
|
+
|
128
|
+
```rust
|
129
|
+
fn main() {
|
130
|
+
let power_of_two = |i| (0..i).fold(1, |x, _| x * 2);
|
131
|
+
let v = (0..10).map(power_of_two).collect::<Vec<i128>>();
|
132
|
+
|
133
|
+
for i in v {
|
134
|
+
println!("{}", i);
|
135
|
+
}
|
136
|
+
}
|
137
|
+
```
|
138
|
+
|
139
|
+
Rustに慣れてきたら、こういう書き方にも挑戦してみてください。
|
140
|
+
|
141
|
+
あと、`i128`型の計算ですが、64ビットのCPUでは直接計算できず、ソフトウェアで計算することになりますので遅いです。もし可能なら、CPUが直接計算できる`i64`や`u64`などを使うのがおすすめです。
|
1
フォーマットを修正しました
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
元のコードですがクロージャを使うための文法が間違っています。その間違いのせいで、コンパイラはそれをクロージャだと認識せずに、`|`演算子によるビット和(bit or)演算だと勘違いしています。
|
2
2
|
|
3
|
-
*元のコードのクロージャ部分*
|
3
|
+
**元のコードのクロージャ部分**
|
4
4
|
|
5
5
|
```rust
|
6
6
|
i | i | {
|