Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir检查guard中的字符串是否为整数_Elixir - Fatal编程技术网

Elixir检查guard中的字符串是否为整数

Elixir检查guard中的字符串是否为整数,elixir,Elixir,是否可以检查传入的字符串参数是否为整数?例如,我需要根据其id(“12345”)或外部id(“euv9wwzz48bmzsui6ivcle2nhgiepomlwc9iodv”)检索模型。这有可能实现吗?我尝试了is_integer,但它返回false,因为它不尝试解析字符串 def call(%{params: %{"id" => id}} = conn, module) when is_atom(module) and is_integer(id) do ZB.Repo.get!

是否可以检查传入的字符串参数是否为整数?例如,我需要根据其id(“12345”)或外部id(“euv9wwzz48bmzsui6ivcle2nhgiepomlwc9iodv”)检索模型。这有可能实现吗?我尝试了
is_integer
,但它返回false,因为它不尝试解析字符串

def call(%{params: %{"id" => id}} = conn, module) when is_atom(module) and is_integer(id) do
    ZB.Repo.get!(module, id)
  |> check(conn)
end
def call(%{params: %{"id" => id}} = conn, module) when is_atom(module) do
  ZB.Repo.get_by!(module, external_id: id)
end

不,这不能在警卫里做。您可以在guard中调用的函数是有限的,并且不包括任何用于检查字符串是否只包含数字的函数

您可以改为在正文中使用
Integer.parse/1

def call(%{params: %{"id" => id}} = conn, module) when is_atom(module) do
  case Integer.parse(id) do
    {_, ""} -> 
      ZB.Repo.get!(module, id) |> check(conn)
    
    _ -> 
      ZB.Repo.get_by!(module, external_id: id)
  end
end
这是一个问题,我相信你们试图用一种不正确的方式解决这个不可回避的问题:)

根据我从您的输入中看到的,
external_id
应该是长度为40的字母数字字符串。这里的关键字是字母数字。也就是说,40次“1”可能是一个
extral\u id
。你知道吗?可以通过以下方式对其进行完美解析:

iex | 1▶ [“1”]|>List.duplicate(40)|>Enum.join |>Integer.parse
#⇒ {1111111111111111111111111111111111111111, ""}
也就是说,在这种情况下检查整数是无效的,因为它可能会导致误报

实际上,您需要做的是尝试通过
external\u id
获取记录,可能是基于记录的长度或其他原因,如果没有成功,则返回到
id
。此外,二进制文件的长度可能确实在guard中检查(通过引入中间包装二进制文件隐式地检查)⇒ 位字符串。)

def调用(%%{params:%%{“id”=>id}}}=conn,module)什么时候执行
案例ZB.Repo.get_by(模块,外部_id:id)do
{:好的,记录}->记录
_->ZB.Repo.get!(模块,id)|>检查(连接)
结束
结束

你应该选择@mudasobwa的答案,而不是我的答案;正如他解释的那样,我的不正确@道伯特:老实说,你的回答完全正确,回答的问题是:)