Declaraciones de importación: la palabra clave open (F#)
Una declaración de importación especifica un módulo o un espacio de nombres a cuyos elementos se puede hacer referencia sin utilizar un nombre completo.
open module-or-namespace-name
Comentarios
Hacer referencia al código mediante el espacio de nombres completo o la ruta de acceso completa del módulo cada vez puede dar lugar a un código difícil de escribir, leer y mantener. En su lugar, se puede utilizar la palabra clave open para los módulos y espacios de nombres utilizados con frecuencia, de tal forma que, al hacer referencia a un miembro de ese módulo o espacio de nombres, se pueda utilizar la forma abreviada del nombre en lugar del nombre completo. Esta palabra clave es parecida a la palabra clave using de C#, a using namespace de Visual C++ y a Imports de Visual Basic.
El módulo o el espacio de nombres proporcionado debe estar en el mismo proyecto o en un proyecto o ensamblado al que se haga referencia. En caso contrario, se puede agregar una referencia al proyecto o utilizar la opción de línea de comandos -reference- (o su abreviatura, -r). Para obtener más información, vea Opciones del compilador (F#).
La declaración de importación hace que los nombres estén disponibles en el código que aparece después de la declaración, hasta el final del espacio de nombres, módulo o archivo envolvente.
Si se utilizan varias declaraciones de importación, deben aparecer en líneas independientes.
En el siguiente ejemplo de código se muestra cómo utilizar la palabra clave open para simplificar el código.
// Without the import declaration, you must include the full
// path to .NET Framework namespaces such as System.IO.
let writeToFile1 filename (text: string) =
let stream1 = new System.IO.FileStream(filename, System.IO.FileMode.Create)
let writer = new System.IO.StreamWriter(stream1)
writer.WriteLine(text)
// Open a .NET Framework namespace.
open System.IO
// Now you do not have to include the full paths.
let writeToFile2 filename (text: string) =
let stream1 = new FileStream(filename, FileMode.Create)
let writer = new StreamWriter(stream1)
writer.WriteLine(text)
writeToFile2 "file1.txt" "Testing..."
El compilador de F# no emite ningún error ni advertencia cuando se producen ambigüedades en caso de que el mismo nombre aparezca en más de un módulo o espacio de nombres abierto. Si se produce alguna ambigüedad, F# da preferencia al módulo o espacio de nombres que se ha abierto más recientemente. Por ejemplo, en el código siguiente, empty significa Seq.empty, aunque empty se encuentra en los dos módulos, Seq y List.
open List
open Seq
printfn "%A" empty
Por consiguiente, deben extremarse las precauciones cuando se abran módulos o espacios de nombres como List o Seq, que contienen miembros con nombres idénticos; en su lugar, puede ser preferible utilizar nombres calificados. Debe evitarse cualquier situación en que el código dependa del orden de las declaraciones de importación.
Espacios de nombres que se abren de manera predeterminada
Algunos espacios de nombres se utilizan con tanta frecuencia en el código de F# que se abren implícitamente sin la necesidad de una declaración de importación explícita. En la tabla siguiente se muestran los espacios de nombres que se abren de manera predeterminada.
Espacio de nombres |
Descripción |
---|---|
Microsoft.FSharp.Core |
Contiene definiciones de tipo básicas de F# para los tipos integrados, tales como int y float. |
Microsoft.FSharp.Core.Operators |
Contiene operaciones aritméticas básicas, tales como + y * |
Microsoft.FSharp.Collections |
Contiene clases de colección inmutables, tales como List y Array. |
Microsoft.FSharp.Control |
Contiene los tipos para las construcciones de control, tales como la evaluación diferida y los flujos de trabajo asincrónicos. |
Microsoft.FSharp.Text |
Contiene funciones para E/S con formato, tales como la función printf. |
Atributo AutoOpen
El atributo AutoOpen se puede aplicar a un ensamblado cuando se desea que se abra automáticamente un espacio de nombres o módulo al hacer referencia al ensamblado. El atributo AutoOpen también se puede aplicar a un módulo para abrirlo automáticamente al abrir el módulo o el espacio de nombres primario. Para obtener más información, vea Core.AutoOpenAttribute (Clase de F#).
Atributo de RequireQualifiedAccess
Algunos módulos, registros o tipos de unión pueden especificar el atributo RequireQualifiedAccess. Cuando se hace referencia a elementos de los módulos, registros o uniones, debe utilizar un nombre completo, independientemente de si incluye una declaración de importación. Si utiliza este atributo estratégicamente en los nombres de tipos que definen comúnmente utilizan, ayudan a evitar conflictos de nombres y, por tanto, que código sean más resistentes a los cambios en las bibliotecas. Para obtener más información, vea Core.RequireQualifiedAccessAttribute (Clase de F#).