为什么这个elixir函数中有下划线?

时间:2016-08-08 05:21:08

标签: elixir phoenix-framework

通过Programming Phoenix书,我看到了如下函数:

defp put_pass_hash(changeset) do
    case changeset do
      %Ecto.Changeset{valid?: true, changes: %{password: pass}} ->
        put_change(changeset, :password_hash, Comeonin.Bcrypt.hashpwsalt(pass))
      _ ->
        changeset
    end
 end

那里的“_”符号是什么?

3 个答案:

答案 0 :(得分:3)

通常在Elixir中,当您在模式匹配中使用_时,您不关心此值。例如:

 {_ , data} = {:ok, body}
 data = body # true

我不想把这个:ok原子放在任何地方,所以在模式匹配中我离开了它。

case中使用了模式匹配。 Cas e在不同的编程语言中只是switch。您可以在一个变量中为预期值创建许多案例。 在使用_的情况下,通常将其作为最后一种模式匹配,因为匹配之前的所有未覆盖的案例。

例如:

def do_i_know_you(name) do
   case name do
     "Molly" -> "Hi Molly"
     "Tom" -> "Hi Tom"
     _ -> "I don't know who you are"
   end
end

在您的特定case中,它会检查您的变更集是否有效,并且更改与添加的密码相关。如果是这样,请根据您的密码输入此更改集password_hash。如果没有,只需返回未更改的变更集。

您可以在此处轻松应用if do end,但casecond通常在Elixir和Phoenix中提供。

答案 1 :(得分:2)

在模式匹配中_只是意味着它可以匹配任何东西。 在case语句中,_作为最后匹配的模式非常常见。

让我们尝试回答你的问题为什么这里有下划线。在通常的情况下,当我们模式匹配案例时,我们正在寻找一些我们知道可能发生的特定模式。示例 -

  case match_me do
   :bold -> "Have some bold text"
   :italic -> "Have some italic text"
   _ -> "Have some text"
  end

当我们匹配时,我们知道如何处理前两个模式,它是一个特定的案例。所有其他案例均由_处理。重要的是我们将它作为最后匹配的模式(下面的任何模式永远不会匹配)

答案 2 :(得分:2)

_是一个不与任何东西绑定的变量的占位符。在案例陈述中,它被用作全能。基本上相当于" else"如果它是一串if / else语句。

在本案例陈述中,您要评估changeset模式是否与有效的Ecto.Changeset匹配?是真的,更改包括密码等...

在所有其他不匹配的情况下,case语句默认为_,它只返回此实例中的变更集。

您可以在此处看到更多示例: http://elixir-lang.org/getting-started/case-cond-and-if.html

如果您还没有阅读完整的"入门" elixir-lang.org网站上的指南,我建议在进一步深入凤凰书之前这样做。至少熟悉语言的词汇是值得的,即使它只是在表面层面,所以当你遇到书中不熟悉的代码时,你有一些参考框架。