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.)
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).
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:
so macht .sort.each
vollkommen Sinn.
Wenn Sie die Art des Blocks verwenden, den sort
im zweiten Beispiel erwartet:
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%Tags und Links ruby arrays glob ruby-1.9.3