gpt4 book ai didi

elixir - 如何测试函数保护子句中结构的值?

转载 作者:行者123 更新时间:2023-12-02 23:29:43 25 4
gpt4 key购买 nike

在 Phoenix/Elixir 应用程序的这个小卫生功能中,当用户没有输入电子邮件时,我遇到了问题。

我正在使用结构来处理数据。还有一个简单的卫生功能(目前)只是去除空格并更新结构(映射)。到目前为止,它运行良好,但是当字段 emailnil 时,我收到错误。

** (FunctionClauseError) no function clause matching in String.Unicode.strip/1

因此,我引入了一个保护子句来检查这种情况,然后仅清理用户名。

defmodule MyApp.User do
defstruct username: nil, email: nil, password: nil, hashed_password: nil

# Sanitizing input without guard clause
def sanitize_user(user) do
%{user | username: String.strip(user.username), email: String.strip(user.email)}
end

# Sanitizing input with guard clause
def sanitize_user(user) when is_nil(user.email) do
%{user | username: String.strip(user.username)}
end

def sanitize_user(user) when is_binary(user.email) do
%{user | username: String.strip(user.username), email: String.strip(user.email)}
end
end

现在我在编译时遇到错误:

** (CompileError) web/models/user.ex:54: cannot invoke remote function Access.get/2 inside guard

我猜这是因为该字段的值在编译时不可用。或者类似的东西。

如何解决这个问题?如何测试保护子句中结构的值?

最佳答案

您关于编译时值不可用的假设是正确的。但是,您可以对映射中的值进行模式匹配并在防护中使用它们。

你可以这样编写你的函数:

  def sanitize_user(%MyApp.User{email: nil} = user) do
%{user | username: String.strip(user.username)}
end
def sanitize_user(%MyApp.User{email: email} = user) when is_binary(email) do
%{user | username: String.strip(user.username), email: String.strip(user.email)}
end

如果您想允许传递其他结构(在本例中不太可能),您也可以在没有 User 结构的 map 上进行匹配:

  def sanitize_user(%{email: nil} = user)

关于elixir - 如何测试函数保护子句中结构的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33959356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com