Warum benötigt auch Dir.glob ("*. txt") .sort .each?

8

Dir.glob("*.txt") {|f| p f} druckt Dateinamen.

Dir.glob("*.txt").sort {|f| p f} schlägt mit einem ArgumentError fehl.

Dir.glob("*.txt").sort.each {|f| p f} gibt Dateinamen in alphabetischer Reihenfolge aus.

Warum scheitert der zweite? Besser noch, warum funktioniert der erste, mit oder ohne .each ?

  • Dir.glob und Dir.glob.sort sind beide Arrays.
  • Dir.glob.methods == Dir.glob.sort.methods .

(Inspiriert von Alphabetische Ergebnisse von Dir.glob . Kein Duplikat von < a href="https://stackoverflow.com/questions/29733611"> Dir.glob mit Sortierproblem , weil das "dritte" bereits die Frage beantwortet.)

    
Camille Goudeseune 20.12.2016, 17:56
quelle

2 Antworten

4

Die andere Antwort ist richtig, aber ich denke, es gibt eine tiefere Erklärung. Wenn Sie nach einem Methodenaufruf einen Block wie Dir.glob("*.txt") {|f| p f} haben, ist der Block ein (optionales) Argument für die Methode. In der Definition von Dir.glob gibt es eine yield -Anweisung, die den Block ausführt.

Wenn Sie die Methoden wie in Dir.glob("*.txt").sort {|f| p f} verketten, wird der Block ein Argument für die Methode sort anstelle der Methode glob . sort kann auch einen Block zum Definieren eines Vergleichs verwenden, aber dieser Block ist in diesem Kontext nicht sinnvoll.

Verkettung each , um Dir.glob("*.txt").sort.each {|f| p f} zu erhalten, macht den Block zu einem Argument für die Methode each , die sie wie glob verwendet (führt den Block für jedes Argument aus).

    
Andrew Piliser 20.12.2016, 18:27
quelle
5

Der zweite schlägt fehl, weil sort {|f| p f} wirklich keinen Sinn ergibt. Der Block, den Sie mit sort verwenden, soll "return -1, 0, oder +1 " und nehmen Sie zwei Argumente (die zu vergleichenden Elemente), aber Ihr Block nimmt ein Argument und gibt dieses Argument zurück, weil p str str zurückgibt.

Der dritte ist in Ordnung, weil sort 's standard comparator block entspricht:

%Vor%

so macht .sort.each vollkommen Sinn.

Wenn Sie die Art des Blocks verwenden, den sort im zweiten Beispiel erwartet:

%Vor%

Dann werden die Dinge besser funktionieren. Oder Sie können den Block einfach weglassen, wenn Sie Dinge in aufsteigender lexikalischer Reihenfolge sortieren möchten:

%Vor%     
mu is too short 20.12.2016 18:13
quelle

Tags und Links