[RUBY] Comportement dans chaque langue lorsque les collouts sont réutilisés avec for

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

Résumé

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é.

Version de chaque langue

Recommended Posts

Comportement dans chaque langue lorsque les collouts sont réutilisés avec for
Comportement lors du retour dans le bloc with
Créez un environnement d'exécution pour chaque langue avec boot2docker
Différences de comportement de chaque langage LL lorsque l'index de la liste est ignoré
Pour ceux qui ont des problèmes avec une erreur lors de l'installation de pip xg boost
Pour ceux qui ont des problèmes car NFC est lu à l'infini lors de la lecture de NFC avec Python
Comportement lorsque plusieurs serveurs sont spécifiés dans les serveurs de noms de dnspython
Comportement en donnant une liste avec shell = True dans le sous-processus
Lorsque vous êtes constamment demandé votre mot de passe de connexion avec Fabric
Dockerfile avec les bibliothèques nécessaires pour le traitement du langage naturel avec python
Afficher l'étiquette de chaque élément lors du dessin d'un diagramme de dispersion dans Pandas
L'histoire selon laquelle le comportement d'héritage est assez différent dans chaque langue
Comportement lors de la liste dans Python heapq
Segfo avec 16 caractères en langage C
L'histoire lorsque différentes distributions sont spécifiées pour le même paramètre dans Optuna
Conseils pour gérer les binaires en Python
[python, multitraitement] Comportement des exceptions lors de l'utilisation du multitraitement
Précautions lors de l'utilisation de l'instruction for dans les pandas
Limiter ssh avec iptables pour chaque utilisateur
Traiter plusieurs listes avec for en Python
Mémorandum de syntaxe fréquemment utilisé pour chaque langue
[Avec modèle japonais] Modèle vectoriel de phrases recommandé pour les personnes qui traitent le langage naturel en 2020
[Pour les débutants] Comportement inattendu si "\" est inclus lors de la définition du chemin en Python
Les chaînes de caractères placées dans GCS avec python sont déformées lorsqu'elles sont visualisées avec un navigateur