In Clojure 1.4, was ist die Verwendung von refer in require?

73

Welchen Vorteil hat die Verwendung von :referin :requiregegenüber der Verwendung von :onlyin :use? Sind die folgenden auch?

(ns so.example (:use [my.lib :only [function]]))

und

(ns so.example (:require [my.lib :refer [function]]))
Andrew
quelle

Antworten:

83

Leitgedanke der Zugabe :referzu :requireist , um vollständig loszuwerden :use, so dass nur ein Bediener andere Pakete zu laden. Sie können vorhandene :usemit (:require [my.lib :refer :all])...

Alex Ott
quelle
Ich verstehe, :referdass wir das loswerden können :use, aber können Sie mich auf eine Dokumentation verweisen, die darauf hinweist, dass dies die Idee war? Ich persönlich halte das :usein bestimmten Fällen für zweckmäßig, beispielsweise bei clojure.test. Warum nicht :usein solchen Fällen verwenden?
Eric Wilson
10
siehe dev.clojure.org/jira/browse/CLJ-879 & Link zur Diskussion in der Clojure-Dev-Mailingliste ...
Alex Ott
26

ja, sie sind gleichwertig,

:referund :requiresind die grundlegenden Operationen, die zum Erstellen von Namespaces erforderlich sind. :useist praktischer

  • :require bewirkt, dass Klassen geladen werden
  • :refer fügt dem Namensraum Dinge hinzu, die eigentlich nur eine Karte sind (eigentlich ein paar Karten)
  • :useist :refer+:require

So sehr es auch aussehen mag, Namespaces haben wirklich keine Magie

wenn Sie einen Namespace wie diesen erstellen

(ns so.example (:use my.lib))

das Äquivalent mit: erfordern wäre:

(ns so.example (:require [my.lib :refer [function1 function2 function3 
                                         list every function in example 
                                         here and remember to keep it 
                                         up to date ]]))
Arthur Ulfeldt
quelle
Es wird fast immer verwendet mit: um Paketen Kurznamen zu geben. ohh und es kam zuerst. Anrufe verwenden: beziehen, beziehen nicht verwenden: verwenden
Arthur Ulfeldt
Ich verstehe immer noch nicht, warum :referhinzugefügt wurde :require. Welches Problem wurde gelöst, das noch nicht geschehen war?
Andrew
16
Andrew, Leitgedanke der Zugabe :referzu :requireist , um loszuwerden , vollständig aus :use. Jetzt können Sie :usemit (:require [my.lib :refer :all])...
Alex Ott
@ AlexOtt Danke. Wenn Sie Ihren Kommentar als Antwort angeben, werde ich ihn akzeptieren.
Andrew
1

Ab der Version 1.4.0 gibt es keinen guten Grund mehr, die Verwendung zu verwenden. Verwenden Sie require: beziehen Sie sich stattdessen. Aus dem Clojure 1.4.0-Änderungsprotokoll: "require kann jetzt eine: refer-Option verwenden .: Refer nimmt eine Liste von Symbolen, auf die aus dem Namespace verwiesen werden soll, oder: all, um alle öffentlichen Variablen einzufügen." (von https://8thlight.com/blog/colin-jones/2010/12/05/clojure-libs-and-namespaces-require-use-import-and-ns.html )

Clojurevangelist
quelle