yield と return
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ return のときの値は直接 .next の返り値使う時くらいしか使われない(使えない)
yield を使うと generator の途中で処理を停止して続きから処理を実行できます
return を使うとそこでジェネレータの処理を終了するので続きから実行できなくなります
一度 return すると done が true になり 次からは undefined が返って来ます
return したときの値は 最初の done が true になるときの value になります
ですが done が true のときの value は基本的に無視されてしまいます
yield* のような続きを別のジェネレータに任せる動きを return ではできなそうです
ジェネレータの最後の値のときに done が true になるようにしても 普通は done が true のときの値は使われないので必要ないみたいです
ということで return のときには値を返すようにはしないほうがよさそうです
var gen = function*(){
var i=0
while(i++ < 5) yield i
return 100
}
for(var val of gen()) console.log(val)
var i=0
while(i++ < 5) yield i
return 100
}
for(var val of gen()) console.log(val)
1
2
3
4
5
2
3
4
5
return を使うとそこでジェネレータの処理を終了するので続きから実行できなくなります
一度 return すると done が true になり 次からは undefined が返って来ます
var gen = function*(){
var val=0
while(true){
val = yield "2倍:" + (val * 2)
if(typeof val !== "number") return "数字ください"
}
}
var ite = gen()
ite.next() // 準備
console.log(ite.next(10))
console.log(ite.next(20))
console.log(ite.next(0))
console.log(ite.next("a"))
console.log(ite.next(30))
var val=0
while(true){
val = yield "2倍:" + (val * 2)
if(typeof val !== "number") return "数字ください"
}
}
var ite = gen()
ite.next() // 準備
console.log(ite.next(10))
console.log(ite.next(20))
console.log(ite.next(0))
console.log(ite.next("a"))
console.log(ite.next(30))
Object {value: "2倍:20", done: false}
Object {value: "2倍:40", done: false}
Object {value: "2倍:0", done: false}
Object {value: "数字ください", done: true}
Object {value: undefined, done: true}
Object {value: "2倍:40", done: false}
Object {value: "2倍:0", done: false}
Object {value: "数字ください", done: true}
Object {value: undefined, done: true}
return したときの値は 最初の done が true になるときの value になります
ですが done が true のときの value は基本的に無視されてしまいます
var gen = function*(){
yield 1
yield 2
yield 3
return 4
}
console.log([...gen()])
for(var val of gen()) console.log(val)
var gen2 = function*(){
yield* gen()
yield 10
}
console.log([...gen2()])
yield 1
yield 2
yield 3
return 4
}
console.log([...gen()])
for(var val of gen()) console.log(val)
var gen2 = function*(){
yield* gen()
yield 10
}
console.log([...gen2()])
[1, 2, 3]
1
2
3
[1, 2, 3, 10]
1
2
3
[1, 2, 3, 10]
yield* のような続きを別のジェネレータに任せる動きを return ではできなそうです
ジェネレータの最後の値のときに done が true になるようにしても 普通は done が true のときの値は使われないので必要ないみたいです
ということで return のときには値を返すようにはしないほうがよさそうです