Erlang相当于if else

jar*_*ryd 14 erlang if-statement

我有两部分代码要执行.两者都是条件

if Value1 < N do something 

else if Value1 >= N do something

if Value2 < N do something 

else if Value2 >= N do something
Run Code Online (Sandbox Code Playgroud)

我希望每个人都能执行一个声明.

如何在erlang中工作?没有别的.我使用多个警卫,但看起来我有4个if语句.分为2组.

if some condition   
code;

if other condition  
code

end.
Run Code Online (Sandbox Code Playgroud)

我收到语法错误.

rvi*_*ing 23

一个表格if是:

if
    <guard 1> -> <body1> ;
    <guard 2> -> <body2> ;
    ...
end
Run Code Online (Sandbox Code Playgroud)

它以自上而下的顺序尝试if-clauses中的守卫(这是定义的)直到它到达成功的测试,然后评估该子句的主体并且if表达式返回正文中最后一个表达式的值.所以else其他语言中的位被融入其中.如果没有一个防护装置成功,则会产生if_clause错误.一个普通的全能后卫true总是能够取得成功,但是一个全能的东西都可以是真实的.

a的表单case是:

case <expr> of
    <pat 1> -> <body1> ;
    <pat 2> -> <body2> ;
    ...
end
Run Code Online (Sandbox Code Playgroud)

它的工作原理是第一评估,然后试图匹配与在运算向下的顺序的情况下子句图案(这被定义),直到一个相匹配,则该子句体评价为值和case表达在返回最后一个表达式的值身体.如果没有模式匹配,则case_clause生成错误.

请注意,if并且case都是表达式(一切都是表达式),因此它们都必须返回值.如果没有成功/匹配,这就是没有默认值的一个原因.还强迫你覆盖所有选项; 这对于特别重要case.if只是一个堕落的情况,case所以它继承了它.有一点历史的if用Erlang基本原理,你可以根据用户的捐款找到trapexit.org.


Ree*_*ore 13

Erlang不允许你有一个if没有true语句选项.这是真实的陈述还是真实的陈述true取决于你,但让你true成为else其他语言是司空见惯的事.

if 
    some_condition -> some_code;
    some_other_condition -> some_other_code;
    true -> else_code
end.
Run Code Online (Sandbox Code Playgroud)

请参阅"如果是什么?" 本页有关此内容的更多信息.

  • 但获得异常是好的.这意味着一个案例没有通过你的计划.可以说,捕捉所有"其他"条款与盲目捕捉所有例外一样糟糕:如果X> 0 - > ......; X <0 - > ......; X =:= 0 - > ...结束.比最后一个句子使用'true'更明确和安全. (5认同)
  • 它肯定允许有一个`if`没有'true`分支,并且在这种情况下会在运行时抛出异常. (4认同)
  • 编写(从外观上)而不是使用时,它不太容易出错。如果您在子句中确实犯了一个错误,则该错误将被隐藏,直到您的数据在其他地方损坏为止。明确显示它会花费更长的时间,但是通常在以后阅读时更安全且更容易理解。请参阅您在底部附近发布的链接,该链接来自Richard O'Keefe。 (2认同)

jj1*_*bdx 6

记住if在Erlang中有一个返回的值,它是一个表达式.这并不是if像在C或Java.

如果你想为一个值做一些事情,代码应该是这样的;

if
  % do something and get the value
  X >= Val -> Something;
  % for doing something otherwise and get the value
  true -> Else_than_the_Something 
end.
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅" ifErlang参考手册" 表达式一节.


pro*_*ver 5

首先,我建议你习惯使用'case'语句,因为'if'条件仅限于保护表达式:

case custom_call(A) of
  1 -> do1(A);
  2 -> do2(A)
end.
Run Code Online (Sandbox Code Playgroud)

除了从R13开始工作的"if"和"case"之外,还有一种方法可以执行条件执行:

  1> N =10.
  10
  2> ((N > 10) andalso more).      
  false
  3> ((N == 10) andalso equals).
  equals
Run Code Online (Sandbox Code Playgroud)