2009-10-06 32 views
7

Gần đây tôi đã cố gắng tìm hiểu các khía cạnh hướng đối tượng của F # và đã trở nên tò mò về cách hạn chế quyền truy cập vào các loại/mô-đun bằng ngôn ngữ.Chữ ký tập tin và truy cập Modifers trong F #

Cụ thể hơn, tôi muốn biết sự khác biệt giữa văn bản này:

Example.fsi

module Stack = 
    val foo : string 

Example.fs

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

và cách khác này:

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

Chúng không hoàn thành chính xác điều tương tự cuối cùng? Đến từ nền C#, tôi có xu hướng sử dụng các công cụ sửa đổi truy cập trên các tệp chữ ký (FSI). Họ dường như linh hoạt hơn (có thể áp dụng cho các mô-đun/loại trong không gian tên, ví dụ), trong khi tôi không có bất kỳ tình huống nào trong đó các tệp chữ ký cung cấp thứ gì đó mà các công cụ sửa đổi truy cập không làm.

+0

Ví dụ của bạn không được hoạt động ;-) (để foo _ = "bar") – Dario

+0

Tại sao nó không hoạt động? Ví dụ biên dịch tốt cho tôi. – Noldorin

+0

.fsi tuyên bố foo là một hàm, nhưng sau đó .fs định nghĩa nó làm giá trị. – Brian

Trả lời

9

Chúng hoàn thành hầu như giống nhau. (Lưu ý rằng bạn có thể sử dụng một tập tin .fsi với nhiều loại trong không gian tên quá, không chắc gì nhận xét của bạn về điều đó nghĩa là gì.)

Một tập tin chữ ký có một vài ưu điểm:

  • Bạn có thể làm cho các đơn vị public cho thời lượng của tệp, nhưng sau đó private vào các tệp tiếp theo của dự án.
  • Bạn chỉ có thể có bản tóm tắt ngắn trong tệp chữ ký, vì vậy giao diện công khai dễ đọc mà không phải quét hàng tấn mã.

Viên đạn đầu tiên không được trifled với - đóng gói trong lắp ráp như thế này thực sự là một tính năng khá lớn cho các dự án rất lớn. Có thể xác định một vài loại được công khai với nhau trong File1.fs, nhưng sau đó chỉ có một tập con của các kiểu/phương thức đó được công khai cho phần còn lại (File2.fs, File3.fs, vv) là khá hữu ích (một chút giống như 'người bạn' trong C++).

+1

@Brian: Cảm ơn câu trả lời. Tôi đã đề cập đến dưới cùng của trang này - http://en.wikibooks.org/wiki/F_Sharp_Programming/Modules_and_Namespaces - không thể sử dụng FSI trên các không gian tên. Bạn có thể làm rõ những gì bạn có nghĩa là "phần tiếp theo" của dự án? – Noldorin

+1

Tôi hiểu, tài liệu đó sai; @ Juliet, nếu bạn đang đọc này, bạn sẽ cập nhật nó? Lưu ý rằng bạn có thể sử dụng fsc --sig trên một tệp .fs chứa các không gian tên để xem cú pháp cho mã .fsi cho các không gian tên. – Brian

+1

@Brian: Ah, đủ công bằng rồi. Lệnh nhỏ hữu ích, đó là. Cảm ơn cho việc làm rõ, quá. – Noldorin

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