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

回答編集履歴

3

誤字などを修正しました

2019/12/27 10:20

投稿

tatsuya6502
tatsuya6502

スコア2055

answer CHANGED
@@ -45,7 +45,7 @@
45
45
  正しい使い方は、まずクロージャを定義して変数から束縛します。
46
46
 
47
47
  ```rust
48
- let power_of_two = | i | {
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
- あと`i128`型の計算ですが、64ビットのCPUでは直接計算できず、ソフトウェアで計算することになりますので遅いです。もし可能ならCPUが直接計算できる`i64`や`u64`などを使うのがおすすめです。
141
+ あと`i128`型ですが、64ビットのCPUでは直接計算できず、ソフトウェアで計算することになりますので計算が遅いです。もし可能ならCPUが直接計算できる`i64`や`u64`などを使うのがおすすめです。

2

map()などでもっと簡潔に書ける方法を追記しました

2019/12/27 10:20

投稿

tatsuya6502
tatsuya6502

スコア2055

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

フォーマットを修正しました

2019/12/27 10:14

投稿

tatsuya6502
tatsuya6502

スコア2055

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  元のコードですがクロージャを使うための文法が間違っています。その間違いのせいで、コンパイラはそれをクロージャだと認識せずに、`|`演算子によるビット和(bit or)演算だと勘違いしています。
2
2
 
3
- *元のコードのクロージャ部分*
3
+ **元のコードのクロージャ部分**
4
4
 
5
5
  ```rust
6
6
  i | i | {