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).