2017-05-10 5 views
4

Il y a quelque chose que je ne comprends pas très bien quand je lis du code Clojure (disons de divers projets sur GitHub): dans l'expression :require, est-ce que vous devez utiliser :as lorsque vous n'utilisez que des fonctions auxquelles vous faites référence? ? Aussi, je ne suis pas sûr qu'il y ait une différence entre Clojure et ClojureScript de ce point de vue, ni s'il y a une convention.Sont: référer et: être utilisé simultanément?

Par exemple (j'utilise les chats bibliothèque pour les exemples, mais c'est juste un exemple) si je fais ceci:

(ns example.core 
    (:require 
    [cats.core] 
    [cats.monad.maybe :as maybe])) 

, disons, le REPL que je peux faire ceci:

REPL> (cats.core/mappend (maybe/just 1)) 

Mais ce n'est pas très pratique, donc je peux le faire à la place:

(ns example.core 
    (:require 
    [cats.core :as m] 
    [cats.monad.maybe :as maybe])) 

REPL> (m/mappend (maybe/just 1)) 

maintenant, au cas où j'utiliser mappend (et quelques autres) tout le temps, je pouvais faire:

(ns example.core 
    (:require 
    [cats.core :refer [mappend]] 
    [cats.monad.maybe :as maybe])) 

REPL> (mappend (maybe/just 1)) 

Ma question est: est-il utile en utilisant à la fois :as et :refer, comme dans l'exemple suivant?

(ns example.core 
    (:require 
    [cats.core :as m :refer [mappend]] ; does this make any sense? 
    [cats.monad.maybe :as maybe])) 

Je comprends que je sois en utilisant, par exemple, mappend tout le temps et peut vouloir s'y référer directement comme mappend mais bind pas souvent à l'aide :refer mais encore assez souvent pour que l'écriture cats.core/bind n'est pas pratique, alors j'utiliserais m/bind?

Y a-t-il une règle? Comme si vous utilisez :as vous ne devriez pas utiliser :refer, ou l'inverse? Ou que vous devriez toujours utiliser les deux? En ce qui concerne ClojureScript, fonctionne-t-il exactement de la même manière?

Répondre

7

Vous avez raison sur le cas d'utilisation; les choses que vous utilisez assez souvent, vous pouvez vouloir :refer directement, sinon, utilisez simplement l'alias :as pour y accéder. Il n'y a aucun problème à faire les deux.

Je préfère personnellement :as à moins qu'il est très clair que la fonction namespace ed :refer provenait (par exemple, je reconnaîtrais >!! sans préfixe, mais trouver m/bind plus lisible).

Le guide de style le plus largement utilisé suggère afaik que leur utilisation en conjonction est très bien, mais préfèrent :as à :refer dans la plupart des cas: https://github.com/bbatsov/clojure-style-guide#comprehensive-ns-declaration

Clojurescript doit être exactement la même chose pour :refer et :as dans ns.

+1

Oui, et parfois vous souhaitez utiliser les deux en même temps, par exemple lorsque vous décidez d'utiliser core.async 'primitives' sans préfixe d'espace de nommage (': refer [!]') Mais vous devez éviter les conflits avec Clojure core ('async/into'). – glts

+0

@glts: ah c'est très intéressant. Et je n'ai pas pensé aux affrontements: ça a beaucoup de sens. Merci à vous deux. –