Elixir:如何在guard中判断字符串是否为整数并实现模型检索?
判断字符串是否为整数(含Guard实现方案)
好问题!在Elixir里直接用is_integer/1确实没法判断字符串形式的整数——它只检查变量的类型是不是整数,完全不会解析字符串内容。针对你的场景(区分数字格式的模型ID和长字符串格式的external_id),我给你两种实用的解决方案:
1. 基础判断函数
用Elixir内置的Integer.parse/1就能搞定,这个函数会返回两种结果:
- 如果字符串能解析出整数,返回
{整数, 剩余未解析的字符串} - 如果完全解析不了,返回
:error
我们只需要判断剩余字符串是否为空,就知道整个字符串是不是纯整数了:
def string_integer?(str) do case Integer.parse(str) do {_int, ""} -> true _ -> false end end
测试几个你的场景:
string_integer?("12345")→true(符合模型ID的格式)string_integer?("eUv9wWzZ48bMZsuII6ivCle2NHgIEPoMLWC9ioDV")→false(符合external_id的格式)- 边缘情况
string_integer?("123abc")→false(避免把带后缀的字符串误判为整数)
2. 在Guard中实现判断
如果你需要在函数的guard子句里做这个判断,可以用defguard(Elixir 1.10+支持)封装逻辑,这样就能在guard里直接调用了:
defguard is_string_integer(str) when is_binary(str) and Integer.parse(str) != :error and elem(Integer.parse(str), 1) == ""
或者用更易读的case写法(同样能在guard里运行):
defguard is_string_integer(str) do is_binary(str) and case Integer.parse(str) do {_, ""} -> true _ -> false end end
之后你就能在检索函数里直接用这个guard区分两种ID了:
def retrieve_model(id) when is_string_integer(id) do # 按数字ID查询模型的逻辑 end def retrieve_model(external_id) when is_binary(external_id) do # 按external_id查询模型的逻辑 end
这样一来,调用retrieve_model("12345")会走第一个分支,调用retrieve_model("eUv9wWzZ48bMZsuII6ivCle2NHgIEPoMLWC9ioDV")会走第二个分支,完美匹配你的需求~
内容的提问来源于stack exchange,提问作者Michael St Clair
相关产品推荐
相关产品推荐

