回答編集履歴

5

スライスと実体のライフタイムの長さの要件が逆になっていたので修正しました

2018/11/06 02:52

投稿

tatsuya6502
tatsuya6502

スコア2035

test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
 
32
32
 
33
- スライスは型に参照`&`が現れているように、それ自体は値の実体を持たず、別の場所にある実体(配列、`Vec`など)を参照します。スライスは実体なしには存在できません。つまりスライスのライフタイム(生存期間)は実体のライフタイムよりもくなければなりません。
33
+ スライスは型に参照`&`が現れているように、それ自体は値の実体を持たず、別の場所にある実体(配列、`Vec`など)を参照します。スライスは実体なしには存在できません。つまりスライスのライフタイム(生存期間)は実体のライフタイムよりもくなければなりません。
34
34
 
35
35
 
36
36
 

4

私のinsert関数にバグがあったため修正しました

2018/11/06 02:52

投稿

tatsuya6502
tatsuya6502

スコア2035

test CHANGED
@@ -72,7 +72,7 @@
72
72
 
73
73
  if v.is_empty() {
74
74
 
75
- Vec::new()
75
+ vec![x]
76
76
 
77
77
  } else {
78
78
 

3

配列型の表記の間違いを修正しました

2018/11/05 02:11

投稿

tatsuya6502
tatsuya6502

スコア2035

test CHANGED
@@ -1,4 +1,8 @@
1
- 最初に知っておいてほしいのは、`&[T]`はスライス型であって、配列型ではないことです。配列型は`&[T; 10]`のように、要素の型と要素数が入った型になります。`insert()`関数は任意の長さ(`N`とします)の配列を引数に取り、長さ`N + 1`の配列を返しますが、Rustではそのような関数は定義できません。
1
+ 最初に知っておいてほしいのは、`&[T]`はスライス型であって、配列型ではないことです。配列型は`[T; 10]`のように、要素の型と要素数が入った型になります。
2
+
3
+
4
+
5
+ `insert()`関数は任意の長さ(`N`とします)の配列を引数に取り、長さ`N + 1`の配列を返しますが、Rustではそのような関数は定義できません。
2
6
 
3
7
 
4
8
 

2

説明を微修正

2018/11/05 02:01

投稿

tatsuya6502
tatsuya6502

スコア2035

test CHANGED
@@ -116,8 +116,8 @@
116
116
 
117
117
 
118
118
 
119
- なお上の実装では、`insert()`関数が呼ばれるたびに毎回新しいベクタを作るため効率はよくありません。これはもし配列が使えたとしても効率の面では同じです。
119
+ なお上の実装では、`insert()`関数が呼ばれるたびに新しいベクタを作るため効率はよくありません。これはもし配列が使えたとしても効率の面では同じです。
120
120
 
121
121
 
122
122
 
123
- もし`isort()`が引数にとったスライス(`&mut [T]`)をその場で変更してもよいのなら、効率の良い実装もできます。(その場合はかなり違ったプログラムになるので例は割愛します)
123
+ もし`isort()`と`insert()`が引数にとったスライス(`&mut [T]`)をその場で変更してもよいのなら、効率の良い実装もできます。(その場合はかなり違ったプログラムになるので例は割愛します)

1

誤字を修正しました

2018/11/05 01:52

投稿

tatsuya6502
tatsuya6502

スコア2035

test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  // これならコンパイルできるが、引数に長さ1の配列しか取れない
14
14
 
15
- fn insert()<T: Ord+Clone>(x: T, v: [T; 1]) -> [T; 2] {
15
+ fn insert()<T: Ord+Clone>(x: T, v: [T; 1]) -> [T; 2] {
16
16
 
17
17
  ```
18
18
 
@@ -48,7 +48,7 @@
48
48
 
49
49
 
50
50
 
51
- 残念ながら、このプログラムですと配列またはスライスを返すことはできません。
51
+ 残念ながら、このプログラムですと配列またはスライスを返すことはできません。
52
52
 
53
53
 
54
54
 
@@ -116,4 +116,8 @@
116
116
 
117
117
 
118
118
 
119
+ なお上の実装では、`insert()`関数が呼ばれるたびに毎回新しいベクタを作るため効率はよくありません。これはもし配列が使えたとしても効率の面では同じです。
120
+
121
+
122
+
119
- なお上の実装では、`insert()`関数が呼ばれるたびに毎回新しいベクタを作るため効率はよくありません。これはもし配列が使えたとしても効率の面では同じです。`isort()`が引数にとったスライス(&mut [T]`)をその場で変更してもよいのなら、効率の良い実装も可能です。(その場合はかなり違ったプログラムになるので例は割愛します)
123
+ もし`isort()`が引数にとったスライス(`&mut [T]`)をその場で変更してもよいのなら、効率の良い実装もできます。(その場合はかなり違ったプログラムになるので例は割愛します)