我是 elixir 的新手,正在尝试找出重写此 ruby 方法的正确方法:
def filter_events(events)
events.select { |event| event[:id].present? && event[:vhost].present? }
end
Run Code Online (Sandbox Code Playgroud)
在灵丹妙药。这是我到目前为止:
def filter_events(events) do
Enum.filter(events, &(Map.has_key?(&1, :id) && Map.has_key?(&1, :vhost)))
end
Run Code Online (Sandbox Code Playgroud)
有没有更好/更惯用的方法来做到这一点?
你的例子太短了,这并不重要;它是可读的。但是,大多数示例,包括docs 中的示例,都使用内联/匿名函数:
Enum.filter(events, fn(event) ->
Map.has_key?(event, :vhost) and Map.has_key?(event, :id)
end)
Run Code Online (Sandbox Code Playgroud)
如果你正在寻找更聪明的东西,你可以使用模式匹配Kernel.match?()。
Enum.filter(events, &match?(%{id: _, vhost: _}, &1))
Run Code Online (Sandbox Code Playgroud)
或使用内联函数:
Enum.filter(events, fn(event) -> match?(%{id: _, vhost: _}, event) end)
Run Code Online (Sandbox Code Playgroud)
由于您正在尝试检查键是否存在并且它们的值不为空,因此以下应该有效:
Enum.filter(events, fn(event) ->
!is_nil(event[:vhost]) and !is_nil(event[:id])
end)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3190 次 |
| 最近记录: |