Notez que le comportement semble être différent selon la langue.
C# ##
using System;
using System.Collections.Generic;
class Program {
static IEnumerable<string> Three() {
yield return "one";
yield return "two";
yield return "three";
}
static void Main() {
var co = Three();
Console.WriteLine("1");
foreach (var x in co)
Console.WriteLine(x);
Console.WriteLine("2");
foreach (var x in co)
Console.WriteLine(x);
}
}
Résultat de l'exécution:
1
one
two
three
2
one
two
three
JavaScript(Node)
"use strict"
function* three() {
yield "one";
yield "two";
yield "three";
}
function main() {
var co = three();
console.log("1");
for (let x of co)
console.log(x);
console.log("2");
for (let x of co)
console.log(x);
}
main();
Résultat de l'exécution:
1
one
two
three
2
Julia
function three()
produce("one")
produce("two")
produce("three")
end
function main()
co = @task three()
println("1")
for x = co
println(x)
end
println("2")
for x = co
println(x)
end
end
main()
Résultat de l'exécution:
1
one
two
three
2
Lua
function three()
coroutine.yield("one")
coroutine.yield("two")
coroutine.yield("three")
end
function main()
co = coroutine.wrap(three)
print("1")
for x in co do
print(x)
end
print("2")
for x in co do
print(x)
end
end
main()
Résultat de l'exécution:
1
one
two
three
2
lua: a.lua:17: cannot resume dead coroutine
stack traceback:
[C]: in function 'for iterator'
a.lua:17: in function 'main'
a.lua:23: in main chunk
[C]: in ?
Python
def three():
yield "one"
yield "two"
yield "three"
def main():
co = three()
print("1")
for x in co:
print(x)
print("2")
for x in co:
print(x)
main()
Résultat de l'exécution:
1
one
two
three
2
Post-scriptum:
Il existe également les méthodes suivantes.
class three:
def __iter__(self):
yield "one"
yield "two"
yield "three"
Résultat de l'exécution:
1
one
two
three
2
one
two
three
Ruby
def three
Enumerator.new do |y|
y << "one"
y << "two"
y << "three"
end
end
def main
co = three()
puts "1"
for x in co
puts x
end
puts "2"
for x in co
puts x
end
end
main
Résultat d'exécution
1
one
two
three
2
one
two
three
En C # et Ruby, si le même collout est réutilisé dans l'instruction for, il se comporte comme s'il était extrait depuis le début de l'élément. Dans JavaScript (Node), Julia, Lua et Python, le collout se comporte de manière à ne pas pouvoir être réutilisé car il est épuisé.
Recommended Posts