2016-02-09 16 views
5

Đọc qua F# 4.0 spec, tôi thấy sau đây trên trang 79 của PDF:Tại sao bạn sử dụng Builder.Source() trong trình tạo biểu thức tính toán tùy chỉnh?

Chức năng phụ trợ src(e) biểu b.Source(e) nếu ForEach cùng là từ mã người dùng thay vì tạo ra bởi các dịch thuật và một người thợ xây b chứa phương thức Source. Nếu không, src(e) biểu thị e.

Đây là ngữ cảnh của mô tả chi tiết (chi tiết) mô tả cách biểu thức tính toán được phân tích cú pháp và chuyển thành chuỗi cuộc gọi phương thức trên đối tượng trình tạo đối tượng. Scott Wlaschin's Computation Expressions series, mà tôi thấy là vô giá trong việc giúp tôi hiểu phần còn lại của các khái niệm đằng sau biểu thức tính toán, không đề cập đến phương pháp Source, cũng như bất kỳ tham chiếu nào khác mà tôi có thể tìm thấy. (Google không có nhiều trợ giúp với điều này, vì rất nhiều người nói về mã nguồn và bất kỳ tham chiếu nào đến các phương thức Source đều bị chôn vùi).

Tôi cũng không thấy Source được ghi lại ở bất kỳ đâu trong số MSDN page on computation expressions. QueryBuilder class sử dụng Source, vì vậy tôi có một ví dụ tôi có thể xem xét, nhưng không có giải thích lý do tại sao điều này sẽ hữu ích trong các trường hợp khác.

Trong trường hợp nào bạn muốn có phương thức Source trên trình tạo biểu thức tính toán tùy chỉnh? Điều gì sẽ là một kịch bản mà việc xử lý mặc định ForEach là không phù hợp với nhu cầu của một người và phương pháp Source sẽ hữu ích?

+0

@mydogisbox - Cảm ơn bạn đã liên kết nhưng tôi đã thấy trang đó trước đó. Tôi nhận ra rằng 'Source()' đang được gọi với nội dung của mệnh đề 'in' (tức là' cho mục trong x' tạo ra một lời gọi tới 'Source (x)'). Và tôi hiểu rằng 'Source' sẽ trả lại một cái gì đó phù hợp để đi vào 'For'. Tôi hoàn toàn không thấy * tại sao *. 'QueryBuilder.Source' muốn một IEnumerable hoặc một IQueryable (kế thừa từ IEnumerable), cả hai đều phù hợp với một hàm' For' để lặp lại. Vậy tại sao cuộc gọi 'Source' lại cần ở đây? Tại sao không chỉ nói "Họ đã cho tôi một IEnumerable, vì vậy tôi sẽ lặp qua nó"? – rmunn

+0

Tôi nghĩ rằng chúng tôi đang nói về cùng một điều, tôi chỉ không có đủ chỗ trong một bình luận để giải thích những gì tôi có ý nghĩa. 'For' tôi đang nói đến là' QueryBuilder.Đối với ', được gọi để xử lý biểu thức' for' trong 'truy vấn {** cho ** khách hàng trong db. Khách hàng chọn khách hàng}'. – rmunn

Trả lời

4

Tôi không có bất kỳ kiến ​​thức nội bộ nào về điều này, nhưng đây là lý do tại sao tôi nghĩ phương pháp này tồn tại, dựa trên bản dịch và việc triển khai trong tích hợp QueryBuilder.

Tất cả các hoạt động trong QueryBuilder đại diện cho nguồn dữ liệu sử dụng QuerySource<'R, 'Q> nơi 'R là loại của các nguyên tố và 'Q là loại nguồn dữ liệu - một trong hai IEnumerable hoặc IQueryable.

Thực tế là có chỉ là một kiểu dữ liệu có nghĩa là nó không cần phải xác định quá tải riêng cho IQueryableIEnumerable - mà sẽ được trường hợp cần thiết bởi vì phương pháp Run ở cuối cần phải làm những việc khác nhau cho IEnumerable và cho IQueryable.

Vì vậy, phương pháp Source cho phép bạn chuyển đổi bất kỳ đầu vào nào truy vấn có thể hoạt động trên một số "đại diện nội bộ" của nguồn dữ liệu. Ở đầu đối diện, phương thức Run chuyển dữ liệu từ biểu diễn bên trong này thành giá trị thông thường. (Trong trường hợp QueryBuilder, bạn không bao giờ thấy loại QuerySource trong mã của riêng mình.)

+0

"Vì vậy, phương thức' Source' cho phép bạn chuyển đổi bất kỳ đầu vào nào, truy vấn có thể hoạt động trên một số "đại diện bên trong" của nguồn dữ liệu. . " - Đây là câu mà làm cho nó "bấm" cho tôi. Cảm ơn, đó là lời giải thích mà tôi cần. – rmunn

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