2015-01-01 16 views
6
unregister_name({local,Name}) -> 
    _ = (catch unregister(Name)); 
unregister_name({global,Name}) -> 
    _ = global:unregister_name(Name); 
unregister_name({via, Mod, Name}) -> 
    _ = Mod:unregister_name(Name); 
unregister_name(Pid) when is_pid(Pid) -> 
    Pid. 

Đây là từ gen_server.erl. Nếu _ luôn khớp và kết quả phù hợp luôn đánh giá biểu thức bên phải, thì các dòng _ = expression() đang làm gì ở đây?Mục đích của mã gen_server.erl này là gì?

Trả lời

7

thường _ = ... trận đấu được sử dụng để làm yên dialyzer cảnh báo về giá trị trả về hàm chưa khớp khi tùy chọn -Wunmatched_returns của nó được sử dụng. Như các tài liệu giải thích:

-Wunmatched_returns 
    Include warnings for function calls which ignore a structured return value or 
    do not match against one of many possible return value(s). 

Bằng cách kết hợp một cách rõ ràng giá trị trả về so với _ "không quan tâm" biến, bạn có thể sử dụng tùy chọn dialyzer hữu ích này mà không cần phải nhìn thấy cảnh báo cho các giá trị bù lại bạn không quan tâm đến .

3

Trong Erlang, biểu thức cuối cùng của hàm là giá trị trả về của nó, vì vậy ai đó có thể bị cám dỗ để kiểm tra, những gì global:unregister_name/1 hoặc Mod:unregister_name(Name) trả lại và cố gắng khớp mẫu trên đó.

_ = expression() không thực hiện bất kỳ điều gì đặc biệt, nhưng gợi ý rằng giá trị trả về này sẽ bị bỏ qua (ví dụ, vì chúng không được ghi lại và có thể thay đổi). Tuy nhiên trong biểu thức cuối cùng, Pid được trả về một cách rõ ràng. Điều này có nghĩa là bạn có thể kết hợp mẫu như sau:

case unregister_name(Something) of 
    Pid when is_pid(Pid) -> foo(); 
    _ -> bar() 
end. 

Tóm lại: những dòng này không đọc mã nguồn, chúng hiển thị mục đích lập trình ban đầu.

Thật không may, chức năng cụ thể này không được xuất khẩu và trong các mô-đun ban đầu không bao giờ được sử dụng trong mô hình phù hợp, vì vậy tôi không có một ví dụ để trở lại này lên :)

+0

Điều này cũng hợp lý. –

1

Và tôi sẽ lưu ý rằng tôi đã từ come across this:

The Power of Mười - Quy định cho phát triển an toàn Critical Mã

Gerard J. HOLZMANN Laboratory

NASA/JPL cho Phần mềm đáng tin cậy Pasadena, CA

[...]

  1. Quy tắc: Giá trị trả về của hàm không trống phải được kiểm tra theo từng chức năng gọi và phải kiểm tra tính hợp lệ của thông số bên trong mỗi chức năng.

    Lý do: Đây có thể là quy tắc vi phạm thường gặp nhất và do đó có phần nghi ngờ là quy tắc chung hơn. Ở dạng nghiêm ngặt nhất, quy tắc này có nghĩa là ngay cả giá trị trả lại của báo cáo printf và báo cáo đóng tệp phải được kiểm tra. Tuy nhiên, một trường hợp có thể nếu xảy ra phản hồi với lỗi sẽ đúng là không khác với phản hồi thành công, có ít điểm trong việc kiểm tra rõ ràng giá trị trả về. Điều này thường xảy ra với các cuộc gọi để printf và đóng.Trong trường hợp như vậy, có thể chấp nhận rõ ràng truyền giá trị trả về hàm tới (void) - do đó cho biết rằng lập trình viên rõ ràng và không vô tình quyết định để bỏ qua giá trị trả lại. Trong trường hợp đáng ngờ hơn, nhận xét phải là để giải thích tại sao giá trị trả lại không liên quan. Tuy nhiên, trong hầu hết các trường hợp, , không được bỏ qua giá trị trả về của hàm, đặc biệt nếu các giá trị trả về lỗi phải được nhân lên trên chuỗi cuộc gọi . Các thư viện chuẩn nổi tiếng vi phạm quy tắc này với các hậu quả nghiêm trọng tiềm ẩn. Xem, ví dụ, những gì sẽ xảy ra nếu bạn vô tình thực thi strlen (0), hoặc strcat (s1, s2, -1) với thư viện chuỗi chuẩn C - nó không đẹp. Bằng cách giữ nguyên quy tắc chung của , chúng tôi đảm bảo rằng các ngoại lệ phải được biện minh, với các trình kiểm tra cơ khí gắn cờ vi phạm. Thông thường, việc tuân thủ quy tắc sẽ dễ dàng hơn để giải thích tại sao sự không tuân thủ có thể được chấp nhận.

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