Erlang 在if语句的记录中查找一个成员
我正在尝试查看当前记录是否包含该成员Erlang 在if语句的记录中查找一个成员,erlang,Erlang,我正在尝试查看当前记录是否包含该成员 #U{name ="roger", age18} #U{name = "roger"}= User -> Same = fun(X) -> if X|| {X, X#U.name} <- User -> true; true -> false end end, 因此,当我调用#U{name=“roger”}=
#U{name ="roger", age18}
#U{name = "roger"}= User ->
Same = fun(X) ->
if X|| {X, X#U.name} <- User -> true;
true -> false
end
end,
因此,当我调用#U{name=“roger”}=User时,我只列出name=roger的记录并将其存储在User中
我想做的是,无论我的当前记录是什么,如果id与用户匹配,那么为true,否则为false
这一个编译,但什么也不做
if X#U.name =:= User
请帮帮我。我不知道我做错了什么,也不知道我是如何不使用X的???您的代码示例非常疯狂,因此我将从头开始 唱片是糖衣元组。就这些。没别的了 Erlang不是C、Algol、Go、Python、Perl等。因此,在输入函数体后检查
if
或cond
中的特定值的想法通常是错误的。使用匹配代替
让我们从一个标记的元组开始,它看起来像{user,Name,Age}
。我们如何在一个功能头中匹配它?假设我们要编写一个函数,专门处理每个名为“Anna Graham”的人,对他们的用户记录做一些处理,根据他们的年龄运行一些函数,并返回一个元组;名字不同的人会得到不同的待遇:
do_stuff(U = {user, "Anna Graham", Age}) ->
A = step1(U),
B = step2(Age),
{ok, {A, B}};
do_stuff(U) ->
Result = other_stuff(U),
{ok, Result}.
注意,我们没有绑定Name
变量,因为它从未被使用过,我们只是直接匹配名称;任何指定其他名称的人都符合默认情况
现在让我们假设我们想做这个特殊的程序,但只针对24岁的人:
do_stuff(U = {user, "Anna Graham", Age = 24}) ->
A = step1(U),
B = step2(Age),
{ok, {A, B}};
do_stuff(U) ->
Result = other_stuff(U),
{ok, Result}.
我们确实绑定了Age
值,因为我们使用了它,但我们也可以这样编写该函数:
do_stuff(U = {user, "Anna Graham", 24}) ->
A = step1(U),
B = step2(24),
{ok, {A, B}};
do_stuff(U) ->
Result = other_stuff(U),
{ok, Result}.
但这在代码中隐藏了一个神奇的值,被认为是草率的编码实践
那么这些记录呢?下面是一些完全等效的代码:
-record(user, {Name, Age}).
do_stuff(U#user{name = "Anna Graham", age = 24}) ->
A = step1(U),
B = step2(U#user.age),
{ok, {A, B}};
do_stuff(U) ->
Result = other_stuff(U),
{ok, Result}.
(注意我使用的术语“完全等效”。我是认真的。编译器实际上会在编译时将您的记录拆开,并按照我编写早期版本的方式重写它。请记住:Erlang记录不是Python dicts或Perl哈希或SomeLang中的任何其他K/V内容。在这种情况下,由于语法的原因,记录可能会被过度杀戮,可能会更加丑陋;但是在大型复杂元组中它们可以非常方便地简化。)
或者我们甚至可以用另一种方式编写函数头,将=
符号堆叠起来,并在年龄
上进行匹配,然后立即将其分配给年龄
:
do_stuff(U#user{name = "Anna Graham", age = Age = 24}) ->
% stuff
但是,如果我们需要对一个年龄超过24岁的人做些什么,如果她的年龄小于或等于24岁,我们应该以不同的方式对待她,那该怎么办呢
do_stuff(U#user{name = "Anna Graham", age = Age}) when Age =< 24 ->
process_young(U);
do_stuff(U#user{name = "Anna Graham", age = Age}) when > 24 ->
process_older(U);
do_stuff(U) ->
other_stuff(U).
在大多数情况下,您希望在函数头中使用简单的模式匹配。通常这更容易阅读。但是,有时,您会遇到这样的情况:预处理的值会根据某些条件提供一些进一步的处理,但这种情况并不需要完全反汇编成几个新函数,因此使用if
或cond
确实是最好的选择。是\U{name=“roger”}=User->
您的代码行应该在案例中
表达式?由于缺少上下文,代码没有意义,因此很难为您提供帮助。
do_stuff(U#user{name = "Anna Graham", age = Age}) when Age =< 24 ->
process_young(U);
do_stuff(U#user{name = "Anna Graham", age = Age}) when > 24 ->
process_older(U);
do_stuff(U) ->
other_stuff(U).
do_stuff(U#user{name = "Anna Graham", age = Age})
Preprocessed = step1(U),
Result = if
Age > 24 -> older_step2(Preprocessed);
Age =< 24 -> young_step2(Preprocessed)
end,
{ok, Result};
do_stuff(U) ->
other_stuff(U).