2016-08-25 17 views

Trả lời

26

Không có cú pháp trực tiếp cho or ở giữa mẫu nhưng bạn có thể sử dụng một người bảo vệ:

case testvalue do 
    n when n in [200, 400] -> 
    true 
    _ -> 
    false 
end 

Bạn cũng có thể sử dụng or trong bảo vệ. Điều này sẽ làm việc quá nhưng là tiết hơn:

case testvalue do 
    n when n == 200 or n == 400 -> 
    true 
    _ -> 
    false 
end 

Cả hai sẽ chạy như nhau nhanh như in lính gác bên trong được chuyển đổi thành so sánh + or, như đã đề cập trong docs.

1

Đối với trường hợp cụ thể này, có lẽ việc trả lại những điều sau đây sẽ là tốt nhất?

testvalue in [200, 400] 

Ví dụ:

def test_my_value(testvalue), do: testvalue in [200, 400] 

Nó sẽ đánh giá để true hoặc false như dự định.

Một khả năng khác sẽ được sử dụng cond:

cond do 
    testvalue in [200, 400] -> 
    true 
    true -> 
    false 
end 
+0

'cond' với 'đúng -> 'không thực sự làm việc vì tôi cần điều kiện trả về true hoặc false. Làm thế nào bạn đã viết nó điều kiện cuối cùng sẽ luôn luôn phù hợp và do đó kết quả sẽ luôn luôn là sai. –

+2

Cú pháp có vẻ hơi khó hiểu trong trường hợp này, nhưng 'true ->' về cơ bản là tương đương với mệnh đề "else". Xem http://elixir-lang.org/getting-started/case-cond-and-if.html#cond Vì vậy, mã trên DOES trả về 'true' hoặc' false' nếu thích hợp. –

4

Từ kinh nghiệm của tôi, nó có ý nghĩa hơn trong elixir để xử lý các trường hợp với kết hợp các chức năng/mô hình, nó dễ đọc hơn khi cơ sở mã của bạn phát triển.

tôi sẽ làm một cái gì đó như thế:

defp valid_http_response?(200), do: true 
defp valid_http_response?(400), do: true 
defp valid_http_response?(_), do: false 

Tôi đồng ý nó không thực sự có ý nghĩa bây giờ, nhưng trong tương lai bạn sẽ hạnh phúc hơn :)

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