2013-04-09 7 views

Trả lời

15

Erlang không có khái niệm 'không có gì' như 'khoảng trống' hoặc 'đơn vị'. Tôi sẽ đề nghị trả lại một nguyên tử khác như not_ok (hoặc thậm chí là vô hiệu hoặc đơn vị.)

+3

Có, mọi thứ luôn trả về giá trị. Bạn không thể trả về một giá trị. – rvirding

+0

trừ khi bạn ném một ngoại lệ và không xử lý nó – chops

+0

tôi không muốn bất kỳ nguyên tử trong trở lại. tôi chỉ cần thực hiện một thao tác khi điều kiện đầu tiên là đúng. – itamar

4

Câu trả lời hay nhất là không sử dụng nếu, chỉ cần sử dụng.

case A of 
    B -> ok; 
    C -> throw({error,a_doesnt_equal_b_or_whatever_you_want_to_do_now}) 
end 

thường ok hoặc undefined hoặc noop được trả về như nguyên tử đó có nghĩa là về cơ bản, không có gì.

+0

Nếu bạn không sử dụng nhánh thứ hai, tại sao không sử dụng' case' và để nó ngoài? 'if' không có chức năng gì cả. – ckruse

+0

@ckruse Bạn không thể bỏ qua vì 'trường hợp', giống như' if', tạo ra lỗi nếu không có mẫu nào phù hợp. Erlang không có giá trị trả về mặc định, bạn luôn phải xử lý mọi trường hợp. – rvirding

+0

@rvirding đúng, không nghĩ về điều đó ;-) – ckruse

1

Như đã nói, mọi mã sẽ trả lại nội dung nào đó.

Nếu bạn muốn làm một cái gì đó chỉ trong một trường hợp, sau đó bạn có thể viết này:

ok =if 
    A /= B -> do_something(A,B); % note that in this case do_something must return ok 
    true -> ok 
end. 

nếu bạn muốn nhận được những giá trị mới cho A, B, bạn có thể viết những dòng này

{NewA,NewB} = if 
    A /= B -> modify(A,B); % in this case modify returns a tuple of the form {NewA,NewB} 
    true -> {A,B} % keep A and B unchanged 
end. 
% in the following code use only {NewA,NewB} 

hoặc theo một cách "lệch hướng" hơn

%in your code 
... 
ok = do_something_if_different(A,B), 
{NewA,NewB} = modify_if_different(A,B), 
... 

% and the definition of functions 
do_something_if_different(_A,_A) -> ok; 
do_something_if_different(A,B) -> 
    % your action 
    ok. 

modify_if_different(A,A) -> {A,A}; 
modify_if_different(A,B) -> 
    % insert some code 
    {NewA,NewB}. 

nếu bạn mong đợi nó bị treo nếu A == B

%in your code 
... 
ok = do_something_if_different_else_crash(A,B), 
... 


% and the definition of functions 
do_something_if_different_else_crash(A,B) when A =/= B -> 
    % your action 
    ok.