Clojure meta wird nur beibehalten, wenn eine Funktion darauf achtet und die Clojure-Kernfunktionen Meta nicht global erhalten. Die allgemeine Faustregel, die ich gehört habe, ist, dass Sammlungsfunktionen wie conj, assoc usw. Metakonservierung erhalten sollen, aber Sequenzfunktionen wie map, filter, take usw. met nicht beibehalten.
Gibt es irgendwo eine Liste von Funktionen, die Meta schützen?
Es geht nur um die Typen. Sequenzfunktionen verhalten sich so, als würden sie seq
für ihr Argument aufrufen und daher nicht immer den gleichen Objekttyp zurückgeben. Sammlungsfunktionen und typspezifische Funktionen rufen seq nicht auf und geben ein Objekt desselben Typs zurück, das ihnen übergeben wurde. Es gibt ihnen die Illusion, dasselbe Objekt zurückzugeben (dies könnte der Grund für dieses Verhalten sein), auch wenn das nicht der Fall ist. Wir können sagen, dass die Faustregel ist, dass eine Funktion das Meta behält, wenn es den Typ bewahrt.
Achten Sie darauf, wenn Faulheit schwierig ist:
%Vor%Eine Liste der Funktionen, die das Meta für die Sammlung beibehalten, finden Sie auf der Seite Datenstrukturen . Diejenigen, die Meta nicht beibehalten, befinden sich auf der Seite Sequenzen , mit der Ausnahme, dass sie ein Objekt desselben Typs zurückgeben.
Unter der Haube bin ich nicht ganz sicher über die Details, da Faulheit und Chunked Sequence hinzugefügt wurde, aber Sie können sich die Methoden cons
, seq
und seqFrom
aus der Klasse RT
ansehen. Die Funktionen, die Metadaten nicht beibehalten, durchlaufen diese Methoden. Während die Auflistungsfunktionen Methoden verwenden, die für ihre Typen spezifisch sind.