回答編集履歴
2
getter/setter (ver.2)
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
### getter/setter
|
1
|
+
### getter/setter (ver.1)
|
2
2
|
|
3
3
|
|
4
4
|
|
@@ -74,10 +74,6 @@
|
|
74
74
|
|
75
75
|
|
76
76
|
|
77
|
-
### done 値を共有する弊害
|
78
|
-
|
79
|
-
|
80
|
-
|
81
77
|
ただし、done 値を iterable から得るという事は、**全てにおいて done 値を共有する**という事です。
|
82
78
|
|
83
79
|
|
@@ -104,7 +100,73 @@
|
|
104
100
|
|
105
101
|
このように、本来、何度でも反復可能なはずの機能が**1回限りの反復処理**になります。
|
106
102
|
|
107
|
-
「期待する動作」のロジック上、
|
103
|
+
~~「期待する動作」のロジック上、この挙動は不可避なので、その要件が本当に必要なものかどうか、を良く吟味する必要があると考えます。~~
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
(追記) この問題はver.2で解消されました。
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
### getter/setter (ver.2)
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
iterator から iterator.done を**参照(getter)せず**、書き込み(setter)のみを行う事で、done 先の共有問題は解消されます。
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
```JavaScript
|
120
|
+
|
121
|
+
const iterable = {
|
122
|
+
|
123
|
+
done: false,
|
124
|
+
|
125
|
+
[Symbol.iterator]: function () {
|
126
|
+
|
127
|
+
const iterable = this;
|
128
|
+
|
129
|
+
let _done = false;
|
130
|
+
|
131
|
+
|
132
|
+
|
133
|
+
return {
|
134
|
+
|
135
|
+
i: 0,
|
136
|
+
|
137
|
+
get done () { return _done; },
|
138
|
+
|
139
|
+
set done (input) { return _done = iterable.done = input },
|
140
|
+
|
141
|
+
length: 10,
|
142
|
+
|
143
|
+
next: function next () {
|
144
|
+
|
145
|
+
return {
|
146
|
+
|
147
|
+
value: this.i++,
|
148
|
+
|
149
|
+
done: this.done = this.i > this.length
|
150
|
+
|
151
|
+
};
|
152
|
+
|
153
|
+
}
|
154
|
+
|
155
|
+
};
|
156
|
+
|
157
|
+
}
|
158
|
+
|
159
|
+
};
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
for (let v of iterable) console.log(v); // 反復する
|
164
|
+
|
165
|
+
console.log(iterable.done); // true
|
166
|
+
|
167
|
+
for (let v of iterable) console.log(v); // 反復する
|
168
|
+
|
169
|
+
```
|
108
170
|
|
109
171
|
|
110
172
|
|
@@ -114,6 +176,8 @@
|
|
114
176
|
|
115
177
|
- 2019/03/28 22:48 要件解釈に誤りがあった為、getter/setter型にコードを修正
|
116
178
|
|
179
|
+
- 2019/03/28 23:08 「getter/setter (ver.2)」を追記
|
180
|
+
|
117
181
|
|
118
182
|
|
119
183
|
Re: Lhankor_Mhy さん
|
1
要件解釈に誤りがあった為、コード修正
test
CHANGED
@@ -1,4 +1,8 @@
|
|
1
|
+
### getter/setter
|
2
|
+
|
3
|
+
|
4
|
+
|
1
|
-
iterable
|
5
|
+
**getter/setter** を駆使して、iterable に `done` 値を引き継げば、期待通りに動作すると思います。
|
2
6
|
|
3
7
|
|
4
8
|
|
@@ -8,15 +12,27 @@
|
|
8
12
|
|
9
13
|
const iterable = {
|
10
14
|
|
15
|
+
i: 0,
|
16
|
+
|
17
|
+
done: false,
|
18
|
+
|
11
19
|
[Symbol.iterator]: function () {
|
20
|
+
|
21
|
+
const iterable = this;
|
22
|
+
|
23
|
+
|
12
24
|
|
13
25
|
return {
|
14
26
|
|
15
|
-
i
|
27
|
+
get i () { return iterable.i; },
|
28
|
+
|
29
|
+
set i (i) { return iterable.i = i },
|
30
|
+
|
31
|
+
get done () { return iterable.done; },
|
32
|
+
|
33
|
+
set done (done) { return iterable.done = done },
|
16
34
|
|
17
35
|
length: 10,
|
18
|
-
|
19
|
-
done: false,
|
20
36
|
|
21
37
|
next: function next () {
|
22
38
|
|
@@ -38,13 +54,11 @@
|
|
38
54
|
|
39
55
|
|
40
56
|
|
41
|
-
const iterator = iterable[Symbol.iterator]();
|
42
|
-
|
43
57
|
let x, y, z;
|
44
58
|
|
45
59
|
|
46
60
|
|
47
|
-
if (!itera
|
61
|
+
if (!iterable.done) {
|
48
62
|
|
49
63
|
[x, y, z] = iterable;
|
50
64
|
|
@@ -52,10 +66,54 @@
|
|
52
66
|
|
53
67
|
|
54
68
|
|
55
|
-
console.log(x, y, z); // 0 1 2
|
69
|
+
console.log(x, y, z); // 0 1 2
|
70
|
+
|
71
|
+
console.log(iterable); // i: 3, done: false, Symbol(Symbol.iterator): ƒ}
|
56
72
|
|
57
73
|
```
|
58
74
|
|
59
75
|
|
60
76
|
|
77
|
+
### done 値を共有する弊害
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
ただし、done 値を iterable から得るという事は、**全てにおいて done 値を共有する**という事です。
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
```JavaScript
|
86
|
+
|
87
|
+
for (let v of iterable) console.log(v); // 反復する
|
88
|
+
|
89
|
+
console.log(iterable.done); // true
|
90
|
+
|
91
|
+
for (let v of iterable) console.log(v); // done 値を教諭している為、反復しない
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
const array = [1,2,3];
|
96
|
+
|
97
|
+
for (let v of array) console.log(v); // 反復する
|
98
|
+
|
99
|
+
for (let v of array) console.log(v); // 反復する
|
100
|
+
|
101
|
+
```
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
このように、本来、何度でも反復可能なはずの機能が**1回限りの反復処理**になります。
|
106
|
+
|
107
|
+
「期待する動作」のロジック上、子の挙動は回避不可能なので、その要件が本当に必要なものかどうか、を良く吟味する必要があると考えます。
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
### 更新履歴
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
- 2019/03/28 22:48 要件解釈に誤りがあった為、getter/setter型にコードを修正
|
116
|
+
|
117
|
+
|
118
|
+
|
61
119
|
Re: Lhankor_Mhy さん
|