Erlang相当于if else

时间:2010-12-01 18:44:49

标签: if-statement erlang

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

if Value1 < N do something 

else if Value1 >= N do something

if Value2 < N do something 

else if Value2 >= N do something

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

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

if some condition   
code;

if other condition  
code

end.

我收到语法错误。

4 个答案:

答案 0 :(得分:21)

if的表单是:

if
    <guard 1> -> <body1> ;
    <guard 2> -> <body2> ;
    ...
end

它以自上而下的顺序尝试if-clauses中的守卫(这是定义的)直到它到达成功的测试,然后评估该子句的主体并且if表达式返回值身体中的最后一个表达。因此,其他语言中的else位被烘焙到其中。如果没有一个防护成功,则会生成if_clause错误。一个普通的全能后卫只是true总是成功,但是一切都可以是真实的。

case的表单是:

case <expr> of
    <pat 1> -> <body1> ;
    <pat 2> -> <body2> ;
    ...
end

它的工作原理是首先评估然后尝试将该值与case-clauses中的模式以op-down顺序(这是定义的)匹配,直到一个匹配,然后该子句的主体是 求值并且case表达式返回正文中最后一个表达式的值。如果没有模式匹配,则会生成case_clause错误。

请注意ifcase都是表达式(一切都是表达式),因此它们都必须返回值。如果没有成功/匹配,这就是没有默认值的一个原因。还强迫你覆盖所有选项;这对case尤为重要。 if只是case的堕落情况,所以它继承了它。在Erlang Rationale中有一些if的历史记录,你可以在trapexit.org的用户贡献下找到它。

答案 1 :(得分:13)

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

if 
    some_condition -> some_code;
    some_other_condition -> some_other_code;
    true -> else_code
end.

参见“If if?” this页面上有关此内容的更多信息。

答案 2 :(得分:6)

记住Erlang中的if有一个要返回的值,它是一个表达式。在C或Java中if喜欢

如果您想为某个值做某事,代码应该是这样的;

if
  % do something and get the value
  X >= Val -> Something;
  % for doing something otherwise and get the value
  true -> Else_than_the_Something 
end.

有关详细信息,请参阅Section for the if expression of Erlang Reference Manual

答案 3 :(得分:5)

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

case custom_call(A) of
  1 -> do1(A);
  2 -> do2(A)
end.

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

  1> N =10.
  10
  2> ((N > 10) andalso more).      
  false
  3> ((N == 10) andalso equals).
  equals