我有两部分代码要执行。两者都是条件
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.
我收到语法错误。
答案 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
错误。
请注意if
和case
都是表达式(一切都是表达式),因此它们都必须返回值。如果没有成功/匹配,这就是没有默认值的一个原因。还强迫你覆盖所有选项;这对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