回答編集履歴

2

getter/setter (ver.2)

2019/03/28 14:09

投稿

think49
think49

スコア18166

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

要件解釈に誤りがあった為、コード修正

2019/03/28 14:09

投稿

think49
think49

スコア18166

test CHANGED
@@ -1,4 +1,8 @@
1
+ ### getter/setter
2
+
3
+
4
+
1
- iterable iterator も**任意のプロパティ**定義可能です。
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: 0,
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 (!iterator.done) {
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 さん