在erlang中使用循环进行测试
我有一个价值清单 “Z0010”、“Z0011”、“Z0012”、“Z0013”、“Z0014”、“Z0015”、“Z0016”、“Z0017”、“Z0018”、“Z0019” 我想开发一个在参数中取值的函数 我想在我的函数中做一个测试,如果作为参数传递的值等于列表中的值,在这种情况下,它将显示“existe”,如果不是,它将显示“notexiste” 我尝试:在erlang中使用循环进行测试,erlang,Erlang,我有一个价值清单 “Z0010”、“Z0011”、“Z0012”、“Z0013”、“Z0014”、“Z0015”、“Z0016”、“Z0017”、“Z0018”、“Z0019” 我想开发一个在参数中取值的函数 我想在我的函数中做一个测试,如果作为参数传递的值等于列表中的值,在这种情况下,它将显示“existe”,如果不是,它将显示“notexiste” 我尝试: test(Token)-> case get_user_formid_by_token(Token) of
test(Token)->
case get_user_formid_by_token(Token) of
{ok, H} ->
FormId=string:substr(H, 2, length(H)),
Form=string:to_integer(FormId),
case verify (0019,1,Form) of
{ok}->io:format("existe");
{notok}->io:format("not existe")
end;
{error, notfound}-> io:format("qq")
end.
verify(VariableLength,VariableIncrement,FormId)->
lists:map(fun(I) -> if I =:= FormId ->
{ok};
I =/= FormId ->
{notok}
end
end,
lists:seq(0010, VariableLength, VariableIncrement)).
但当我执行此代码时,它显示:
1> model:test("21137900").
** exception error: no case clause matching [{notok},
{notok},
{notok},
{notok},
{notok},
{notok},
{notok},
{notok},
{notok},
{notok}]
in function model:test/1
我现在尝试使用此解决方案:
get_user_formid_by_token(Token) ->
Q = qlc:q([{X#person.formid} || X <- mnesia:table(person),
X#person.token =:= Token]),
case do(Q) of
[{H}] ->
{ok, H};
[] ->
{error, notfound}
end.
test(Token)->
case get_user_formid_by_token(Token) of
{ok, H} ->
io:format("~s~n",[H]),
FormId=string:substr(H, 5, length(H)),
io:format("~s~n",[FormId]),
Form=string:to_integer(FormId),
io:format("~p~n",[Form]),
lists:member(Form, lists:seq(313, 320, 1));
{error, notfound}-> io:format("qq")
end.
结果应该是true而不是false
我认为Form=string:to_integer(FormId),
在本例中它不会返回313
还有一件事我想添加到我的代码中
例如,如果H等于“Z000010”FormId=string:substr(H,2,长度(H))
它返回“000010”
现在我想消除第一个整数前面的第一个零,因此extarct 0000
在1
列表之前:map/2
获取一个列表并创建一个具有相同数量值的新列表,因此10个值的列表将转换为10个{ok}
或{notok}
元组的列表
您可能希望改为列表:member/2
5> lists:member(0, lists:seq(1, 3, 1)).
false
6> lists:member(3, lists:seq(1, 3, 1)).
true
7> lists:map(fun(X) -> ok end, lists:seq(1, 3, 1)).
[ok,ok,ok]
请查看文档(): 因此
to_integer
返回一个元组,其中包含从字符串和字符串其余部分使用的数字。您甚至可以从测试输出中看出它在哪里显示{313,[]}
。为了获得绑定到表单
变量的数字的值,您需要分解元组,这通常通过模式匹配完成:
{Form,_Rest}=string:to_integer(FormId)
现在,您的表单将只包含编号313
string:to_integer
函数还将愉快地吃掉前导零:
1> {Form, _} = string:to_integer("000010"), Form.
10
我认为Form和313的值不具有相同的类型
{Form,_Rest}=string:to_integer(FormId)
1> {Form, _} = string:to_integer("000010"), Form.
10