Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Impor deklarasi: Kata
Deklarasi impor menentukan modul atau namespace yang elemennya dapat Anda referensikan tanpa menggunakan nama yang sepenuhnya memenuhi syarat.
Sintaksis
open module-or-namespace-name
open type type-name
Komentar
Mereferensikan kode dengan menggunakan namespace layanan atau jalur modul yang sepenuhnya memenuhi syarat setiap kali dapat membuat kode yang sulit ditulis, dibaca, dan dikelola. Sebagai gantinya open , Anda dapat menggunakan kata kunci untuk modul dan namespace yang sering digunakan sehingga ketika Anda mereferensikan anggota modul atau namespace layanan tersebut, Anda dapat menggunakan bentuk pendek nama alih-alih nama yang sepenuhnya memenuhi syarat. Kata kunci ini mirip using dengan kata kunci di C#, using namespace di Visual C++, dan Imports di Visual Basic.
Modul atau namespace yang disediakan harus berada dalam proyek yang sama atau dalam proyek atau perakitan yang dirujuk. Jika tidak, Anda dapat menambahkan referensi ke proyek, atau menggunakan -reference opsi baris perintah (atau singkatannya, -r). Untuk informasi selengkapnya, lihat Opsi Pengkompilasi.
Deklarasi impor membuat nama tersedia dalam kode yang mengikuti deklarasi, hingga akhir namespace, modul, atau file yang menyertakan.
Saat Anda menggunakan beberapa deklarasi impor, deklarasi tersebut akan muncul pada baris terpisah.
Kode berikut menunjukkan penggunaan open kata kunci untuk menyederhanakan kode.
// 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..."
Pengkompilasi F# tidak mengeluarkan kesalahan atau peringatan ketika ambiguitas terjadi ketika nama yang sama terjadi di lebih dari satu modul atau namespace terbuka. Ketika ambiguitas terjadi, F# memberikan preferensi pada modul atau namespace yang baru dibuka. Misalnya, dalam kode berikut, empty berarti , meskipun empty terletak di List modul dan SeqSeq.empty.
open List
open Seq
printfn %"{empty}"
Oleh karena itu, berhati-hatilah saat Anda membuka modul atau namespace seperti List atau Seq yang berisi anggota yang memiliki nama yang identik; sebagai gantinya, pertimbangkan untuk menggunakan nama yang memenuhi syarat. Anda harus menghindari situasi di mana kode bergantung pada urutan deklarasi impor.
Deklarasi jenis terbuka
F# mendukung open pada jenis seperti:
open type System.Math
PI
Ini akan mengekspos semua bidang statis dan anggota yang dapat diakses pada jenis .
Anda juga open dapat membuat rekaman yang ditentukan F#dan jenis serikat yang didiskriminasi untuk mengekspos anggota statis. Dalam kasus serikat yang didiskriminasi, Anda juga dapat mengekspos kasus serikat. Ini dapat membantu untuk mengakses kasus serikat dalam jenis yang dideklarasikan di dalam modul yang mungkin tidak ingin Anda buka, seperti:
module M =
type DU = A | B | C
let someOtherFunction x = x + 1
// Open only the type inside the module
open type M.DU
printfn "%A" A
Buka dari jalur akar hanya dengan global penentu
Modul berlapis seperti
module A =
module B =
...
dapat dibuka melalui
open A // opens A
open B // opens A.B
Untuk membuka hanya modul atau namespace yang sepenuhnya memenuhi syarat awalannya dengan penentu global :
open global.A // works
open global.B // this now fails
open global.A.B // works
Namespace yang Terbuka secara Default
Beberapa namespace sangat sering digunakan dalam kode F# sehingga dibuka secara implisit tanpa perlu deklarasi impor eksplisit. Tabel berikut ini memperlihatkan namespace yang terbuka secara default.
| Namespace | Deskripsi |
|---|---|
FSharp.Core |
Berisi definisi jenis F# dasar untuk jenis bawaan seperti int dan float. |
FSharp.Core.Operators |
Berisi operasi aritmatika dasar seperti + dan *. |
FSharp.Collections |
Berisi kelas koleksi yang tidak dapat diubah seperti List dan Array. |
FSharp.Control |
Berisi jenis untuk konstruksi kontrol seperti evaluasi malas dan ekspresi asinkron. |
FSharp.Text |
Berisi fungsi untuk IO yang diformat, seperti printf fungsi . |
Buka Otomatis Atribut
Anda dapat menerapkan atribut ke AutoOpen rakitan jika Anda ingin secara otomatis membuka namespace atau modul saat rakitan dirujuk. Anda juga dapat menerapkan atribut ke AutoOpen modul untuk membuka modul tersebut secara otomatis saat modul induk atau namespace dibuka. Untuk informasi selengkapnya, lihat AutoOpenAttribute.
Atribut RequireQualifiedAccess
Beberapa modul, rekaman, atau jenis serikat dapat menentukan RequireQualifiedAccess atribut . Saat mereferensikan elemen modul, rekaman, atau serikat tersebut, Anda harus menggunakan nama yang memenuhi syarat terlepas dari apakah Anda menyertakan deklarasi impor. Jika Anda menggunakan atribut ini secara strategis pada jenis yang menentukan nama yang umum digunakan, Anda membantu menghindari tabrakan nama dan dengan demikian membuat kode lebih tahan terhadap perubahan pustaka. Untuk informasi selengkapnya, lihat RequireQualifiedAccessAttribute.