我对Erlang
我有一个列表:
List = [[{name, <<"redCar1">>}, {turbo, true}], [{name, <<"redCar2">>}, {turbo, true}], [{name, <<"greenCard">>}, {turbo, false}]].
现在我要过滤所有"red"
汽车
我尝试使用:
filterCar() ->
MyF = fun(List) ->
case lists:keyfind(name, 1, List) of
{name, <<"red", _Rest/binary>>} ->
true:
_ ->
false
end
end,
MyF.
然后
lists:filter(MyF, List),
效果很好。
现在我想创建一个通用函数来过滤,例如:
myfilter(Value, List) ->
case lists:keyfind(name, 1, List) of
{name, <<Value, _Rest/binary>>} ->
true;
_ ->
false
end.
但是当我尝试执行此功能时,我总是[]
空列表。
我确定问题是当我尝试传递Value
因为我替换
{name, <<Value, _Rest/binary>>}
带
{name, <<"red", _Rest/binary>>}
有效。
我的目标是在忽略大小写中找到以car
开头的所有字符串。
答案 0 :(得分:2)
你只需要指出另外两件事就可以在你的二进制文件中使用一般值:它是二进制文件,以及二进制文件的大小。
filterCar(Value) when is_binary(Value) ->
MyF = fun(List) ->
Size = byte_size(Value),
case lists:keyfind(name, 1, List) of
{name, <<Value:Size/binary, _Rest/binary>>} ->
true;
_ ->
false
end
end,
MyF.
首先我们更改filterGuard
以获取一个参数Value
,这是我们想要查找的模式。我们在函数上使用保护来确保Value
是二进制。在内部fun
内,我们首先通过Value
检索byte_size/1
的大小,这是我们需要的,以便我们可以在匹配的二进制文件中设置预期的字段大小。这会导致密钥更改,即<<Value:Size/binary, _Rest/binary>>
:我们设置Value
字段的预期大小,并将其定义为binary
字段。
通过此更改,我们可以成功将其应用于您的List
变量,并将<<"red">>
传递给Value
:
1> lists:filter(filterCar(<<"red">>), List).
[[{name,<<"redCar1">>},{turbo,true}],
[{name,<<"redCar2">>},{turbo,true}]]