2009-10-06 17 views
7

Ho recentemente cercato di imparare gli aspetti orientati agli oggetti di F # e sono diventato curioso di sapere come limitare l'accesso a tipi/moduli nella lingua.Firma di file e Modificatori di accesso in F #

Più in particolare, voglio sapere la differenza tra scrivere questo:

Example.fsi

module Stack = 
    val foo : string 

Example.fs

module Stack = 
    let foo = "foo" 
    let bar = "bar" 

e in alternativa questo:

module Stack = 
    let foo = "foo" 
    let private bar = "bar" 

Alla fine non realizzano esattamente la stessa cosa? Provenendo da uno sfondo C#, sono molto propenso a usare i modificatori di accesso sui file di firma (FSI). Sembrano essere più versatili (possono applicarsi a moduli/tipi in spazi dei nomi, ad esempio), mentre non ho alcuna situazione in cui i file di firma offrono qualcosa che i modificatori di accesso non lo fanno.

+0

L'esempio non dovrebbe funzionare in ogni caso ;-) (lascia che foo _ = "bar") – Dario

+0

Perché non dovrebbe funzionare? L'esempio si compila bene per me. – Noldorin

+0

Il .fsi dichiara foo come una funzione, ma poi .fs lo definisce come un valore. – Brian

risposta

9

Realizzano quasi la stessa cosa. (Si noti che è possibile utilizzare un file .fsi per i tipi di spazi dei nomi troppo, non sapeva che cosa i suoi commenti su che significava.)

Un file di firma ha un paio di vantaggi:

  • possibile rendere le entità public per la durata del file, ma poi private per i file successivi del progetto.
  • Si può avere solo un breve riassunto nel file di firma, quindi l'interfaccia pubblica è facile da leggere senza dover scannerizzare tonnellate di codice.

Il primo proiettile non deve essere scherzato: l'incapsulamento all'interno dell'assemblaggio come questo è in realtà una caratteristica abbastanza grande per progetti molto grandi. Essere in grado di definire alcuni tipi che sono pubblici l'uno con l'altro all'interno di File1.fs, ma solo un sottoinsieme di quei tipi/metodi è pubblico per il resto (File2.fs, File3.fs, ecc.) È abbastanza utile (un po 'come "amico" in C++).

+1

@Brian: Grazie per la risposta. Mi riferivo alla parte inferiore di questa pagina - http://en.wikibooks.org/wiki/F_Sharp_Programming/Modules_and_Namespaces - non essendo in grado di utilizzare gli FSI sui namespace. Potresti chiarire cosa intendi per "il seguito" del progetto? – Noldorin

+1

Vedo, quel documento è sbagliato; @ Juliet, se stai leggendo questo, vorresti aggiornarlo? Si noti che è possibile utilizzare fsc --sig su un file .fs contenente spazi dei nomi per vedere la sintassi per il codice .fsi per i namespace. – Brian

+1

@Brian: Ah, abbastanza giusto allora. Piccolo comando utile, cioè. Grazie anche per il chiarimento. – Noldorin

Problemi correlati