2012-10-19 41 views
22

Học thuyết được khuyến nghị để sử dụng thuộc tính AutoOpen là gì?Thuộc tính AutoOpen trong F #

(Câu hỏi này có lẽ là trong việc tiếp tục để when to use module function VS static function on similarly named type)

Expert F # khẳng định rằng "Điều này có thể hữu ích khi bạn đang định quảng cáo hoc top-level khai thác và chức năng:"

Vì vậy, đây dường như ở đây để giảm bớt vai trò của mô-đun trong tổ chức mã, khi bạn về mặt kỹ thuật cần một mã để viết mã nhưng bạn loại bỏ sự tồn tại của nó khỏi quan điểm của khách hàng.

Có điều gì khác không? Khi nào bạn sử dụng?

Trả lời

30

Tôi nghĩ rằng việc sử dụng chính cho thuộc tính AutoOpen là khi bạn muốn tạo một số giá trị được gắn sẵn khi người dùng thư viện của bạn mở một vùng tên. Đây là nơi thuộc tính rất hữu ích, vì tôi nghĩ rằng các thư viện thường xuất tất cả các định nghĩa trong các không gian tên, nhưng đối với một số mục đích bạn cần xuất giá trị và không thể xác định giá trị bên trong không gian tên.

Dưới đây là một ví dụ từ F# async extensions trong đó xác định một người thợ xây tính toán và do đó nó cần phải xuất khẩu asyncSeq giá trị (nhưng cùng một lúc, tất cả các chức năng được bọc trong một không gian tên):

namespace FSharp.Async 

type AsyncSeq<'T> = (* ... *) 
type AsyncSeqBuilder() = (* ... *) 

[<AutoOpen>] 
module GlobalValues = 
    let asyncSeq = AsyncSeqBuilder() 

Người sử dụng của thư viện chỉ có thể viết open FSharp.Async và họ sẽ thấy asyncSeq. Tôi nghĩ rằng cùng một khuôn mẫu được sử dụng với các thư viện toán học khác nhau (trong đó bạn cũng muốn xuất đơn giản hàm được đặt tên.)

Đối với module (ví dụ ListSeq), tôi nghĩ rằng hầu hết những người không sử dụng open và truy cập chức năng thông qua một tên mô-đun (chẳng hạn như List.map), vì vậy mặc dù bạn có thể sử dụng điều này cho các mô-đun lồng nhau, tôi đã không thấy điều đó thường xuyên.

+0

Việc bạn sử dụng VALUES làm rõ cách sử dụng nó. thks – nicolas

16

Nó có thể được dùng để sắp xếp một module vào sub-module nhưng trình bày một cái nhìn thống nhất/đơn mô-đun bên ngoài:

module Outer = 

    [<AutoOpen>] 
    module Inner1 = 
    let f1() =() 

    [<AutoOpen>] 
    module Inner2 = 
    let f2() =() 

open Outer 

let x = f1() 
let y = f2() 

FParsec thực hiện điều này: open FParsec mở tất cả các tiểu module (Primitives, CharParsers, vv .).

+1

thú vị – nicolas

Các vấn đề liên quan