2010-07-22 29 views
6

Tôi đã viết một mô-đun Erlang, nơi không phải tất cả các chức năng nội bộ được gọi trực tiếp. Thay vào đó, có một vài chức năng trông giống như sau:Suppressing Erlang "không sử dụng chức năng" cảnh báo

weird_func(Cmd, Args) -> 
    ?MODULE:Cmd(Args). 

Đó là một ví dụ đơn giản, nhưng bạn có ý tưởng. Trình biên dịch Erlang phun ra cảnh báo về các chức năng không sử dụng, khi thực tế chúng được sử dụng, không phải trực tiếp. Có cách nào để ngăn chặn những cảnh báo này không? Lý tưởng nhất là tôi không muốn ngăn chặn tất cả các cảnh báo như vậy, nhưng thay vào đó tôi muốn nói cho trình biên dịch Erlang xem xét một vài chức năng cụ thể như các trường hợp đặc biệt.

+2

Gọi chức năng theo cách đó sẽ chỉ hoạt động nếu được xuất. Bạn đang thực sự thực hiện cuộc gọi "bên ngoài" với nó ngay cả khi bạn sử dụng '? MODULE', chỉ là một macro được xác định trước mở rộng đến tên mô-đun và chuyển tên hàm làm đối số. N.B. 'Args' sẽ là danh sách các đối số và hàm được gọi sẽ chỉ có một đối số. – rvirding

Trả lời

6

Nếu một hàm không được xuất, cũng không được gọi rõ ràng, nó được báo cáo là không sử dụng. Vì vậy, bạn có hai cách để đi:

1) Xuất các chức năng được sử dụng gián tiếp. Nếu bạn không muốn những chức năng để được gọi từ bên ngoài module, bạn có thể đánh dấu này trong các tài liệu

2) Gọi mỗi chức năng rõ ràng trong weird_func (và trong ý kiến.):

weird_func(fun1, [A1,A2]) -> 
    fun1(A1, A2); 
weird_func(fun2, []) -> 
    fun2(); 
weird_func(fun3, [A1,A2,A3]) -> 
    fun3(A1,A2,A3). 

này sau này có chi tiết hơn một chút, nhưng nó sẽ cung cấp lỗi tốt hơn cho người dùng, nếu họ gọi hàm không tồn tại

+1

Tôi đoán 2) không phải là một tùy chọn khi bạn sử dụng {weird_result} -> spawn (? MODULE, fun1, [params]); – Daniel

11

Nó không chỉ là vấn đề ngăn chặn cảnh báo. Một chức năng không được báo cáo không thể được gọi theo cách bạn dự định.

-module(foo). 
-export([f/0]). 
f() -> ?MODULE:g(). 
g() -> ok. 

1> c(foo). 
./foo.erl:4: Warning: function g/0 is unused 
{ok,foo} 
2> foo:f(). 
** exception error: undefined function foo:g/0 

Trình biên dịch miễn phí bỏ chức năng chưa sử dụng, chưa được chuyển hoàn toàn. Đơn giản chỉ cần xuất khẩu chức năng làm cho nó có sẵn cuộc gọi bằng cách sử dụng? MODULE: F cú pháp.

2

Về cơ bản, bạn có hai tùy chọn.

Thứ nhất là xuất các chức năng, do đó "sử dụng" chúng. Điều này cũng cần thiết cho ví dụ ban đầu của bạn để làm việc.

thứ 2 là để gọi các chức năng tại địa phương sử dụng một cái gì đó như: (.. Lưu ý rằng ví dụ của tôi không biên dịch Bạn cần phải tách đối số args thành từng miếng tùy thuộc vào func bạn đang gọi)

weird_func(Cmd, Args) -> 
    case Cmd of 
     func1 -> func1(Arg1, Arg2, Arg3); 
     func2 -> func2(Arg1); 
     ... 

+0

Tôi nghĩ rằng việc sử dụng kết hợp mẫu phù hợp hơn trong trường hợp này: 'weird_func (func1, Args) -> ...; weird_func (func2, Args) -> ...; ' –

12

có một tùy chọn biên dịch đặc biệt cho việc này:

http://www.erlang.org/doc/man/compile.html

như vậy, cho quảng cáo chèn ví dụ của bạn irective như thế này:

-compile([{nowarn_unused_function, [{ wierd_function_1,Arity1 }, 
             ... ]}]). 

nhưng cảnh báo trên về trình biên dịch âm thầm loại bỏ các chức năng vẫn đứng như xa như tôi biết.

1

Bạn cũng có thể vượt qua Cmd theo định dạng fun func1/3, ví dụ:

weird_func(fun func1/3, [1, 2, 3])

Bằng cách này, chức năng sẽ không bị loại bỏ.

Chỉnh sửa: Chỉ cần thêm nhận xét của tôi để có thể hữu ích cho người đọc trong tương lai

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