通过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
那里的“_”符号是什么?
答案 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
,但case
和cond
通常在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网站上的指南,我建议在进一步深入凤凰书之前这样做。至少熟悉语言的词汇是值得的,即使它只是在表面层面,所以当你遇到书中不熟悉的代码时,你有一些参考框架。