【问题标题】:Why is this underscore here in this elixir function?为什么这个长生不老药函数中的这个下划线?
【发布时间】:2017-03-05 08:25:34
【问题描述】:

通过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

“_”符号在那里做什么?

【问题讨论】:

  • 你问的是 Elixir 的基本知识,建议你先学 Elixir,然后再学习基于 Elixir 的 Phoenix 框架。一旦你对 Elixir 有了基本的了解,学习 Phoenix 就会变得容易得多。
  • @sbs 最好用粗体字来回答您在评论中所说的内容。

标签: elixir phoenix-framework


【解决方案1】:

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

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

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

模式匹配用于caseCase 在不同的编程语言中只是 switch。您可以为一个变量中的预期值创建多个案例。 在使用_ in case 时,通常将其作为最后一个模式匹配 in case,因为它匹配之前所有未发现的 case

例如:

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,但在 Elixir 和 Phoenix 通常首选 casecond

【讨论】:

    【解决方案2】:

    _ 是不绑定到任何东西的变量的占位符。在case语句中,它被用作一个包罗万象的东西。如果它是一串 if/else 语句,则基本上等同于“else”。

    在这个 case 语句中,您正在评估 changeset 模式是否与有效的 Ecto.Changeset 匹配?为真,更改包括密码等...

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

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

    如果您尚未阅读 elixir-lang.org 网站上的“入门”指南的全部内容,我建议您先阅读一下,然后再继续阅读 Phoenix 书籍。至少熟悉该语言的词汇是值得的,即使只是在表面上,这样当您遇到书中不熟悉的代码时,您就有一些参考框架。

    【讨论】:

      【解决方案3】:

      在模式匹配中_ 仅仅意味着它可以匹配任何东西。 在case 语句中将_ 作为最后一个匹配的模式是很常见的。

      让我们试着回答你的问题为什么这里有一个下划线。在通常的实践中,当我们用大小写进行模式匹配时,我们正在寻找一些我们知道可能发生的特定模式。示例 -

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

      当我们匹配时,我们知道如何处理前两个模式,这是一个特定的情况。所有其他情况由_ 处理。重要的是我们将它作为最后一个匹配的模式(低于此的任何模式都不会匹配)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-30
        • 1970-01-01
        • 1970-01-01
        • 2016-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多