2015-05-11 15 views

risposta

11

esponendo (..) consente di chiamare direttamente una funzione. Ad esempio, se SamplePackage avesse le funzioni x e y, import SamplePackage ti consentirebbe di chiamare SamplePackage.x e SamplePackage.y, mentre import SamplePackage exposing (..) ti consentirebbe di chiamare xey senza specificare il loro pacchetto contenente.

+2

Cosa accadrebbe se importassi due pacchetti con questa sintassi e che entrambi avessero i metodi 'X'? – John

6

Significa che è possibile accedere a tutto direttamente nel modulo Graphics.Element, senza prima specificare il pacchetto. Dal momento che questo esempio utilizza solo "spettacolo" e "Element", è possibile modificare la linea di importazione:

import Graphics.Element exposing (Element, show) 

e sarà ancora lavorare per questo esempio.

+0

Penso che la tua risposta sia migliore di quella accettata, perché hai sottolineato la differenza tra "exposing (..)" e "exposing (Element, show)". – wiser

+1

Suggerirei anche di aggiungere che se è stato usato solo 'importa Graphics.Elements', è ancora possibile accedere a tutto (cioè pubblico) nel modulo' Graphics.Element' come questo: 'Graphics.Element.Element' e' Graphics .Element.show' – wiser

5

Questa è una vecchia domanda, ma risponderò comunque con un altro modo di pensare a exposing (..) e spiegare un po 'sul perché di solito è una cattiva idea. Se hai uno sfondo in programmazione Python, allora puoi pensare a questo come from module import * in Python. Questo codice Elm:

import Graphics.Element exposing (Element, show) 

sarebbe simile a questa in Python:

from Graphics.Element import Element, show 

che tale codice Elm:

import Graphics.Element exposing (..) 

sarebbe simile a questa in Python:

from Graphics.Element import * 

I primi due saranno solo aggiungere i nomi Element e show al namespace del modulo corrente; gli ultimi due esempi aggiungeranno tutti i i nomi da Graphics.Element al tuo spazio dei nomi. Questo è utile quando stai scrivendo il modulo per la prima volta, dato che potresti non sapere ancora quali nomi avrai bisogno da Graphics.Element. Ma una volta finito di scrivere il modulo, è consigliabile tornare indietro e modificare exposing (..) in exposing (just, the, names, you, need). In questo modo puoi essere certo di non avere collisioni di nomi più tardi.

Per un esempio di come conflitti di nomi potrebbe essere un male, dicono che si scrive un modulo chiamato myGraphics, in cui si crea una funzione chiamata rotatedImage, perché non è (al momento) in Graphics.Element. Ma più avanti, Graphics.Element aggiunge una funzione rotatedImage, con semantica sottilmente diversa (ad es. La tua funzione usa i gradi, ma la funzione "ufficiale" usa i radianti). Ora ci sono due rotatedImage funzioni che il codice ha a disposizione ... e si potrebbe facilmente inciampare te stesso:

{- someOtherModule.elm -} 
import Graphics.Element exposing (..) 

{- ... more code ... -} 
someImage = rotatedImage (pi/2) sourceImage -- Angle is in radians 

Ora è necessario una funzione diversa dal modulo myGraphics, quindi si importa:

{- someOtherModule.elm -} 
import Graphics.Element exposing (..) 
import myGraphics exposing (..) 

{- ... more code ... -} 
someImage = rotatedImage (pi/2) sourceImage -- WHOOPS, angle is now in degrees! 

E improvvisamente la rotazione di someImage è stata modificata!Quando hai importato myGraphics, hai intenzione di cambiare la modalità di visualizzazione di someImage nella tua pagina? Quasi certamente no.

Questo è perché import Foo exposing (..) deve essere evitato una volta che il codice è relativamente stabile. È molto utile in fase di sviluppo, poiché non è necessario tornare costantemente all'inizio del codice per aggiungere un altro nome alla dichiarazione import. Ma una volta che hai finito lo sviluppo pesante sul tuo modulo e stai apportando solo occasionalmente modifiche, dovresti davvero passare all'utilizzo di import Foo exposing (just, the, names, you, need). Schivare molte trappole in questo modo.