2016-10-23 14 views
5

Elixir cung cấp một vài is_ chức năng cho phép bạn kiểm tra xem một mục là một loại hình cụ thể:Kiểm tra xem một giá trị là một danh sách từ khóa

  • is_atom
  • is_binary
  • is_map
  • , vv

Nhưng làm cách nào để kiểm tra xem giá trị nào là một danh sách từ khóa trong Elixir? Tôi hiểu rằng bên dưới, danh sách từ khóa là một danh sách các hàng 2 phần tử với phần tử đầu tiên như một nguyên tử, vì vậy cách giải quyết hiện tại của tôi là thế này:

defmodule KList do 
    def is_keyword?(list) when is_list(list) do 
    Enum.all? list, fn item -> 
     case item do 
     {k, _} -> is_atom(k) 
     _  -> false 
     end 
    end 
    end 

    def is_keyword?(_), do: false 
end 

Có một tốt hơn (hoặc một trong xây dựng) cách làm điều này? Và quan trọng hơn, làm thế nào tôi có thể làm điều này trong một điều khoản when?

+2

Bạn sẽ không thể để kiểm tra một danh sách từ khóa trong một điều khoản bảo vệ. Có một danh sách các biểu thức được xác định trước được cho phép trong bảo vệ. Phần mở rộng duy nhất bạn được phép viết là các macro mở rộng đến các biểu thức được cho phép đó. http://elixir-lang.org/docs/master/elixir/guards – mario

Trả lời

7

Tôi không thể tin rằng tôi bị mất nó, nhưng có một mô-đun Keyword rằng xuất khẩu các keyword?/1 phương pháp:

Keyword.keyword?(term)

Returns true nếu term là một danh sách từ khóa; nếu không thì trả false

Ví dụ:

iex> Keyword.keyword?([]) 
true 
iex> Keyword.keyword?([a: 1] 
true 
iex> Keyword.keyword?([{Foo, 1}]) 
true 
iex> Keyword.keyword?([{}]) 
false 
iex> Keyword.keyword?([:key]) 
false 
iex> Keyword.keyword?(%{}) 
false 
Các vấn đề liên quan