【问题标题】:Elixir Phoenix pattern matching "params"Elixir Phoenix 模式匹配“参数”
【发布时间】:2017-03-16 12:47:02
【问题描述】:

在我的具体情况下,我很难理解模式匹配;我正在尝试从 Phoenix 控制器中的 params 获取值,我认为这是一个结构。

iex 中输入params 会导致

%{"edit" => "93213e66-a15e-11e6-8bc7-38c986312498",
  "job_slug" => "7759-tkhkjd-test"}

但是,运行以下命令:

pry(7)> {edit, job_slug} = params

抛出此错误:

** (MatchError) no match of right hand side value: %{"edit" => "93213e66-a15e-11e6-8bc7-38c986312498", "job_slug" => "7759-tkhkjd-test"}
     (stdlib) :erl_eval.expr/3

如何正确匹配params

【问题讨论】:

    标签: pattern-matching elixir phoenix-framework


    【解决方案1】:

    您的params 是一个映射,但您将它与一个元组匹配。你应该试试这个:

    %{"edit" => edit, "job_slug" => job_slug} = params
    

    来自Elixir Pattern Matching guide

    匹配运算符 (=) 不仅用于匹配简单值,而且对于解构更复杂的数据类型也很有用。 [...] 在边不能匹配 [...] 以及比较不同类型时,模式匹配会出错。

    这意味着您的 LHS 和 RHS 必须属于同一类型,并且必须正确匹配才能分配左侧的变量。在您的情况下,您的右手边有一个 Map,左手边有一个 Tuple,这引发了 MatchError


    相关链接:

    【讨论】:

      【解决方案2】:

      你需要匹配结构,而不仅仅是内部位:

      %{"edit" => 编辑,"job_slug" => job_slug} = 参数

      【讨论】:

      • 在这种情况下它不是结构体;这是一张地图。有区别。
      猜你喜欢
      • 1970-01-01
      • 2020-11-25
      • 2019-11-07
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 2015-08-15
      • 2017-10-17
      • 1970-01-01
      相关资源
      最近更新 更多