web-dev-qa-db-fra.com

Dans Clojure 1.4, quelle est l'utilité de refer within require?

Quel avantage l'utilisation de :refer dans :require J'ai fini d'utiliser :only dans :use? Les éléments suivants sont-ils également synonymes?

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

et

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

Idée principale d'ajouter :refer à :require est de se débarrasser complètement de :use, ne laissant qu'un seul opérateur pour charger d'autres packages. Vous pouvez émuler les :use avec (:require [my.lib :refer :all])...

82
Alex Ott

oui, ils sont équivalents,

:refer et :require sont les opérations de base requises pour créer des espaces de noms. :use est plus pratique

  • :require provoque le chargement des classes
  • :refer ajoute des choses à l'espace de nom qui n'est en fait qu'une carte (en fait, quelques cartes)
  • :use est :refer + :require

autant que cela puisse ressembler, il n'y a vraiment pas de magie dans les espaces de noms

si vous créez un espace de noms comme celui-ci

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

l'équivalent avec: require serait:

(ns so.example (:require [my.lib :refer [function1 function2 function3 
                                         list every function in example 
                                         here and remember to keep it 
                                         up to date ]]))
26
Arthur Ulfeldt

Depuis la version 1.4.0, il n'y a plus de bonne raison d'utiliser use. Utilisez require: reportez-vous à la place. Dans le changelog de Clojure 1.4.0: "require peut maintenant prendre une option: refer.: Refer prend une liste de symboles à référencer depuis l'espace de noms ou: all pour faire entrer toutes les variables publiques." (depuis https://8thlight.com/blog/colin-jones/2010/12/05/clojure-libs-and-namespaces-require-use-import-and-ns.html )

1
Clojurevangelist