【问题标题】:Map key exists and value is larger than 0映射键存在且值大于0
【发布时间】:2021-10-18 14:58:29
【问题描述】:

我必须检查一个地图是否有一个键,以及该键的值是否大于 0。目前我使用这个代码:

if Map.has_key?(portfolio, stock) && Map.get(portfolio, stock) > 0 do

我想知道是否有更简单/更好的方法来做到这一点?

【问题讨论】:

    标签: elixir


    【解决方案1】:

    if Map.has_key?(portfolio, stock) && Map.get(portfolio, stock) > 0 do 不安全,因为 术语可以是compared against each other

    iex|?|1 ▸ [] > 0            
    #⇒ true
    

    也就是说,最安全的方法是使用 Kernel.match?/2 与守卫进行模式匹配

    match?(%{stock: stock} when stock > 0, portfolio)
    

    为了防止错误输入,让防护更严格。

    match?(%{stock: stock} when is_number(stock) and stock > 0, portfolio)
    
    iex|?|2 ▸ [%{stock: 3}, %{stock: 0}, %{}, %{stock: []}]
    ...|?|2 ▸ |> Enum.filter(&match?(%{stock: stock} when is_number(stock) and stock > 0, &1))
    #⇒[%{stock: 3}]
    

    旁注: 两个布尔值 的逻辑合取习惯用and 而不是&& 编写。后者用于非严格连接,其中nil 可以视为falsey42 可以视为truthy 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-19
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多