Tôi vừa nhận thấy một hành vi trực quan khá ngược lại khi phần trường của bản ghi F # được khai báo riêng. (Điều này có liên quan đến Is it possible to make a field of a record private? or to make a member of record private?)Phạm vi trợ năng lạ khi các trường của bản ghi F # được khai báo riêng
Trong ví dụ này ...
type MyRec =
private // Fields declared private, or at least I thought so.
{ a : int
b : int }
member x.A = x.a
member private x.Both = x.a + x.b
static member CreateMyRec(a, b) = { a = a; b = b }
let foo = MyRec.CreateMyRec(1,2)
let bar = foo.a // No error. Huh?
let baz = foo.Both // Error: not accessible.
... các thành viên tin Both
là không thể tiếp cận bên ngoài phạm vi khai báo kiểu, như dự kiến. Tuy nhiên, trường có thể truy cập được a
.
Nếu bạn đặt MyRec trong một mô-đun, các trường sẽ trở thành riêng tư cho mô-đun đó. Đó là cách bạn mong đợi một khai báo mức cao nhất trong mô-đun để hoạt động, nhưng tôi mong rằng bất cứ điều gì được khai báo riêng trong một loại, sẽ là riêng tư cho kiểu đó, không phải với mô-đun kèm theo của nó.
Hành vi này có thực sự kỳ lạ không, hoặc tôi có thiếu thứ gì đó trong lý do của tôi ở đây không?
Đó là một cách tinh tế. Sẽ không bao giờ nhận thấy nó mà không có câu trả lời của bạn. –