Ich habe kürzlich herausgefunden, dass die piped Eingänge, die viele Ruby-Methoden verwenden, manchmal nicht notwendig sind, aber das scheint inkonsistent zu sein. Beispielsweise erzeugt diese Zeile ein Array von Strings für gestern, heute und morgen:Wann sind in Ruby Pipeline-Eingaben erforderlich? (| x | x.to_s)
DateTime.now.instance_eval{[prev_day, to_datetime, tomorrow]}.map{|d| d.strftime('%m/%d/%Y')}
=> ["06/20/2016", "06/21/2016", "06/22/2016"]
Wie Sie innerhalb instance_eval sehen können, gibt es keine verrohrt Eingang, und die Funktion geht einfach davon aus, dass die Methoden aufgerufen werden DateTime.now. Aber wenn ich versuche, die gleiche Idee auf die map-Methode anzuwenden:
DateTime.now.instance_eval{[prev_day, to_datetime, tomorrow]}.map{strftime('%m/%d/%Y')}
NoMethodError: undefined method `strftime' for main:Object
Plötzlich versucht es, die Methode auf Haupt verwenden?
Meine Frage ist, warum funktioniert das in der ersten Methode und nicht in der Sekunde?
Ah ha! Wenn ich meinen Code durchführe, ist es immer instance_eval, an dem gearbeitet wird. OK, macht jetzt Sinn. – oMiKeY
Das hat eigentlich überhaupt nichts mit 'instance_eval' zu tun. Ein einfacheres Beispiel wäre '[1,2,3] .map {chr}' und '[1,2,3] .map {| x | x.chr} '. Das Ergebnis ist genau dasselbe. –
@Mike: Ich kann dein Beispiel nicht reproduzieren: '[1,2,3] .map {chr}' ergibt 'NameError: undefinierte lokale Variable oder Methode 'chr' für main: Objekt' auf Ruby 2.3.1 – spickermann