Nó sẽ làm tăng độ phức tạp của trình biên dịch (và ngôn ngữ). Nó chỉ thực sự sôi nổi để làm suy luận kiểu trên một cái gì đó như thế. Như với bất kỳ kiểu suy luận nào liên quan, tất cả đều hoạt động tốt hơn khi bạn có một biểu thức duy nhất. Các báo cáo trả về phân tán có hiệu quả tạo ra rất nhiều phân nhánh tiềm ẩn được gắn kết để thống nhất. Nó không phải là nó đặc biệt cứng, chỉ dính. Ví dụ:
def foo(xs: List[Int]) = xs map { i => return i; i }
Điều gì, tôi hỏi bạn, trình biên dịch có suy luận ở đây không? Nếu trình biên dịch đã làm suy luận với các câu lệnh trả về rõ ràng, nó sẽ cần phải là Any
. Trên thực tế, rất nhiều phương thức có báo cáo trả về rõ ràng sẽ kết thúc trả về Any
, ngay cả khi bạn không bị lén lút với trả về không phải cục bộ. Như tôi đã nói, dính.
Và trên hết, đây không phải là tính năng ngôn ngữ nên được khuyến khích. Lợi nhuận rõ ràng làm không cải thiện độ rõ của mã trừ khi chỉ có một lần trả về rõ ràng và ở cuối hàm. Lý do là khá dễ dàng để xem nếu bạn xem đường dẫn mã như một đồ thị đạo diễn. Như tôi đã nói trước đó, lợi nhuận phân tán tạo ra rất nhiều phân nhánh tiềm ẩn tạo ra những chiếc lá kỳ lạ trên đồ thị của bạn, cũng như nhiều đường dẫn bổ sung trong cơ thể chính. Nó chỉ là sôi nổi. Luồng điều khiển dễ dàng hơn nhiều để xem liệu các nhánh của bạn có rõ ràng hay không (mẫu phù hợp hoặc biểu thức if
) và mã của bạn sẽ hoạt động nhiều hơn nếu bạn không dựa vào các câu lệnh có hiệu lực bên cạnh để tạo ra các giá trị.
Vì vậy, giống như nhiều tính năng khác "nản" trong Scala (ví dụ asInstanceOf
hơn as
), các nhà thiết kế của ngôn ngữ tạo ra một sự lựa chọn có chủ ý để làm cho mọi việc ít dễ chịu. Điều này kết hợp với sự phức tạp mà nó đưa vào suy luận kiểu và tính vô dụng thực tế của các kết quả trong tất cả trừ các kịch bản nhiều nhất. Nó không có ý nghĩa gì đối với scalac để thử kiểu suy luận này.
Đạo đức của câu chuyện: học cách không phân tán lợi nhuận của bạn! Đó là lời khuyên tốt trong bất kỳ ngôn ngữ nào, không chỉ là Scala.
Nguồn
2011-09-05 04:36:16
Xin chào Daniel. Tôi không nhận được lời giải thích của bạn. Scala đã phải kết hợp nhiều biểu thức và các điểm thoát trong các hàm do các câu lệnh if/else. Và ngôn ngữ Scala có rất nhiều thứ phức tạp trong đó IMO mà hầu hết các lập trình viên Scala không hiểu rõ hoặc sử dụng (ví dụ: hiệp phương sai/contravariance, các kiểu cấu trúc, vv). Điều này cho biết thêm rất nhiều phức tạp cho trình biên dịch; vì vậy "làm cho trình biên dịch phức tạp hơn" có vẻ như một câu trả lời yếu. –
@UrbanVagabond Bạn đã bỏ lỡ phần "lợi ích để trở thành người đứng đầu". Chỉ vì một cái gì đó phức tạp không có nghĩa là nó đáng giá thêm độ phức tạp hơn cho nó. Bây giờ, Scala không phải kết hợp nhiều biểu thức và các điểm thoát trên các câu lệnh if/else vì nếu/else là một biểu thức, không phải là các câu lệnh. Điều đó có vẻ như tách tóc, nhưng sự khác biệt là rất thực tế. –