Verwirklichen Sie den PHP / Python-Generator mit Golang / Ruby

Verwirkliche einen Generator mit Golang (Go) / Ruby

[Hier](http://qiita.com/hiroykam/items/2fea445fd2d489354c34#%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3 Als ich Generatoren in PHP und Python3 mit% 82% BF untersuchte, untersuchte ich, wie dies in Golang und Ruby realisiert werden kann.

Generator mit PHP, Python3, Golang, Ruby2.4

Ich habe numbers.txt gelesen und einen einfachen Generator vorbereitet, der die folgenden Ausgabeergebnisse liefert.

numbers.txt


zero
one
two
three
four
five

Ausgabeergebnis


0:zero
1:one
2:two
3:three
4:four
5:five

Für PHP

Verifiziert mit PHP 5.6. Ich habe PHP7 nicht ausgewählt, weil ich diesmal nicht "Yield from" verwendet habe.

<?php

function my_generator($name)
{
    $file = fopen($name, "r");

    if ($file) {
        while ($line = fgets($file)) {
            yield $line;
        }
    }
    fclose($file);
}

$g = my_generator("numbers.txt");
foreach ($g as $k => $v) {
    print($k. ":". $v);
}

Für Python

Dies kann auf die gleiche Weise wie bei PHP erreicht werden. Ich habe 3.5 als Python-Version verwendet.

def my_generator(name):
    with open(name) as lines:
        for line in lines:
           yield line

g = my_generator("numbers.txt")
for k, v in enumerate(g):
    print("%s:%s" % (k, v), end="")

Für Golang

Golang hat hier nicht das Äquivalent von PHP oder Python Yield (siehe Referenz hier). Daher haben wir mit dem Goroutine-Kanal oder -Verschluss etwas Ähnliches erreicht.

Methode mit Goroutine-Kanal

Unter der Annahme, dass die Anzahl der Zeilen in numbers.txt sehr groß sein wird, gibt es Bedenken hinsichtlich der Leistung.

package main

import (
    "bufio"
    "fmt"
    "os"
)

func yield(fp *os.File) chan string {
    ch := make(chan string)

    go func() {
        defer close(ch)

        scanner := bufio.NewScanner(fp)
        for scanner.Scan() {
            ch <- scanner.Text()
        }
        if err := scanner.Err(); err != nil {
            panic(err)
        }
    } ()

    return ch
}

func main() {
    fp, err := os.Open("numbers.txt")
    if err != nil {
        panic(err)
    }
    defer fp.Close()

    i := 0
    for s := range(yield(fp)) {
        fmt.Printf("%d:%s\n", i, s)
        i++
    }
}

Methode mit Verschluss

Möglicherweise gibt es eine Möglichkeit, mit sync.Mutex zu synchronisieren.

package main

import (
    "bufio"
    "fmt"
    "os"
)

func yield(fp *os.File) func() (bool, string) {
    scanner := bufio.NewScanner(fp)
    return func() (bool, string) {
        t := scanner.Scan()
        if err := scanner.Err(); err != nil {
            panic(err)
        }
        return t, scanner.Text()
    }
}

func main() {
    fp, err := os.Open("numbers.txt")
    if err != nil {
        panic(err)
    }
    defer fp.Close()

    y := yield(fp)
    for i := 0;;i++ {
        t, s := y()
        if !t { break }
        fmt.Printf("%d:%s\n", i, s)
    }
}

Für Ruby 2.4

Ruby hat auch "Yield", aber es ist eine Funktionsdefinition, die Blöcke anstelle eines Generators wie PHP / Python empfängt. Die Funktion, die dem Generator von PHP / Python entspricht, enthält einen Enumerator, der wie folgt beschrieben wird.

def my_generator(name)
  return to_enum(__method__, name) unless block_given?
  IO.foreach(name) do |line|
    yield(line.chomp)
  end
end

g = my_generator('numbers.txt')
g.with_index { |l, i| p '%d:%s' % [i, l] }

Wenn hier ein Block vorhanden ist, wird der Block verarbeitet, und wenn kein Block vorhanden ist, kann er als eine Methode behandelt werden, die Enumerator zurückgibt.

Recommended Posts

Verwirklichen Sie den PHP / Python-Generator mit Golang / Ruby
Dynamischer Proxy mit Python, Ruby, PHP
Überlappende Kombinationen mit Obergrenzen in Python / Ruby / PHP / Golang (Go)
Ich habe versucht, Mecab mit Python2.7, Ruby2.3, PHP7 zu verwenden
Gruppierungskombination in Python / Ruby / PHP / Golang (Go)
Java VS PHP VS Python VS Ruby
Zundokokiyoshi mit Python / Rubin / Lua
Über Perl, Python, PHP, Ruby
Behandle Primzahlen mit Python / Ruby / PHP / Golang (Go)
Hierarchie, Reihenfolge, (doppelte) Kombination in Python / Ruby / PHP / Golang (Go)
Scraping mit Node, Ruby und Python
Zufallsgenerator für französische Zahlen mit Python
Realisieren Sie den DB-Verbindungspool mit Golang
Umgang mit regulären Ausdrücken durch PHP / Python
Sende Bild mit Python und speichere mit PHP
PHP / Python / Ruby-Beispiel für die Pfad-API
[Grundlegende Grammatik] Unterschiede zwischen Ruby / Python / PHP
Versuchen Sie, Python von Ruby aus mit Sparsamkeit aufzurufen
Mit Ruby (Rails) verschlüsseln und mit Python entschlüsseln
Einfaches Web-Scraping mit Python und Ruby
Ich habe versucht, die Mastodon-API mit Ruby (Faraday) / Python (Pycurl) / PHP (Curl) zu erreichen.
FizzBuzz in Python3
Scraping mit Python
Wie man Spaß am Programmieren mit Minecraft hat (Ruby, Python)
Statistik mit Python
Scraping mit Python
Python mit Go
Twilio mit Python
In Python integrieren
[Python] Generatorfunktion
Spielen Sie mit 2016-Python
AES256 mit Python
Getestet mit Python
Python beginnt mit ()
mit Syntax (Python)
Bingo mit Python
Zundokokiyoshi mit Python
Excel mit Python
Mikrocomputer mit Python
Mit Python besetzen
Vom Anfangszustand von CentOS8 bis zum Ausführen von PHP Python Perl Ruby mit Nginx
Trends für das Webanwendungs-Framework 2014 (PHP / Java / Ruby / Python / Perl)
Beachten Sie, dass das Schreiben mit Ruby so ist wie das Schreiben mit Python
Eine Geschichte über das Ausprobieren eines (Golang +) Python-Monorepo mit Bazel
Erste Schritte mit Google App Engine für Python und PHP
python, php, ruby Konvertieren von Dezimalzahlen in n
Schreiben wir jeweils Python, Ruby, PHP, Java und JavaScript
Vergleich von CoffeeScript mit JavaScript-, Python- und Ruby-Grammatik
Versionsverwaltung von Node, Ruby und Python mit anyenv
Umgang mit JSON in Ruby, Python, JavaScript, PHP
Serielle Kommunikation mit Python
Zip, entpacken mit Python
Primzahlbeurteilung mit Python
Python mit Eclipse + PyDev.
Socket-Kommunikation mit Python
Datenanalyse mit Python 2
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
[Docker] Tutorial (Python + PHP)
Sequentielle Suche mit Python