2016-05-12 14 views
5

Tôi đang học tập và cố gắng sử dụng dialyzer để đạt được mức an toàn tối đa khi có thể. Có một điều mà tôi không hiểu: loại chức năng không kết thúc là gì và làm thế nào để biểu thị nó trong spec. Bạn có thể làm sáng tỏ điều này không?Loại chức năng không kết thúc trong erlang

Trả lời

7

Một hàm lặp lại vĩnh viễn và không bao giờ chấm dứt có loại trả về no_return(). (Kiểu trả về đó cũng được sử dụng cho các hàm luôn luôn ném ngoại lệ, ví dụ như một hàm lỗi tùy chỉnh. Nếu bạn không chỉ định kiểu trả về đó, Dialyzer sẽ cho bạn biết rằng hàm "không có trả về cục bộ".)

được đề cập trong chương Types and Function Specifications của Hướng dẫn tham khảo Erlang:

Một số chức năng trong Erlang không có nghĩa là trả lại; hoặc vì họ xác định các máy chủ hoặc vì chúng được sử dụng để ném ngoại lệ, như trong các chức năng sau:

my_error(Err) -> erlang:throw({error, Err}). 

Đối với các chức năng như vậy, nó được khuyến khích để sử dụng đặc biệt no_return() kiểu cho họ "trở lại", thông qua một hợp đồng biểu mẫu sau:

-spec my_error(term()) -> no_return(). 
+0

Cảm ơn! Tôi không nghĩ rằng điều này cũng có thể được áp dụng cho các chức năng không kết thúc! – ppopoff

+1

Bài đăng trên blog này mô tả sự khác biệt (không chủ ý) giữa các loại 'no_return()' và 'none()' trong Dialyzer: http://joedevivo.com/2015/06/14/no-local-return.html –

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