一:if 表达式之true的使用
true:在if结构中表示除此之外的所有情况!
对于 if else 的结构 我们采用的是
fun(X) ->
do some thing ;
fun(_) ->
do other thing.
的方式。
如果采用 if 的方式是怎么实现呢,请看下面
fun() ->
if 1 =:= 1 -> //情况一
works
end,
if 1 =:= 1 ; 1 =:= 2 -> //情况二
works
end ,
if 1 =:= 1 , 1 =:= 2 -> //非情况一和二
fails
end .
我们在编译的时候会发现编译报错!这个是为什么呢!
./what_the_if.erl:10: Warning: no clause will ever match
./what_the_if.erl:10: Warning: the guard for this clause evaluates to 'false'
因为 if 1 =:= 1 , 1 =:= 2 <===> if true && false 这个分支永远匹配到并返回一个结果 false .
对于这种情况,其他语言采用的是exception 加 try catch 的方式来处理。但是在erlang中采用的关键字 true来处理。看下面的例子
oh_god(X) ->
if X =:= 2 -> might_successed ;
true -> always_here
end.
-----------------运行结果-------------------------
2> what_the_if:oh_god(2).
might_successed
3> what_the_if:oh_god(3).
always_here
对于if 再看个复杂点的:
complex_if(Animal) ->
Talk = if Animal == cat -> "haha";
Animal == dog -> "heihei";
Animal == pig -> "hoho";
true -> "hehe"
end,
{Animal,"says:" ++ Talk ++ "!"}.
运行结果
--------------------------------------
3> what_the_if:complex_if(jhj).
jhj says:hehe !
注意分号就是orelse的意思,erlang 的语法有时候看起来很没规律!很强调表示式的匹配。
现在我们回过头来看,对于以下两种方式的使用都是可以的,效率上也没什么区别!
方式一 方式二
if X > Y -> a() if X > Y -> a()
; true -> b() ; X =< Y -> b()
end。 end。
if X > Y -> a() if X > Y -> a()
; X < Y -> b() ; X < Y -> b()
; true -> c() ; X ==Y -> c()
end。 end。
但是更推荐使用第二种方式,因为这个更易于理解,且语法清晰简单!
回归点:完整的if true的语法结构;
func() ->
if condition1 -> work1;
condition2 -> work2;
true -> work3 //这个地方没有分号
end.
要点:在erlnag中,任何一个表达式都是由返回值的。没有java中定义的 void 函数这个类型。
二:另一种条件判断 case
基本语法:
case param of //对于什么参数进行判断
Pattern Guards -> ... //具体的匹配模式
end.
看个例子:
-module(temperature).
-export([temperature/1]).
temperature(X) ->
case X of
{c,N} when N >= 20, N =< 50 -> 'fav';
{k,N} when N >= 293,N =< 318 -> 'sc fav';
{f,N} when N >= 68,N =< 113 -> 'fav in us';
_ -> 'fav in ceus'
end.
-------------等同于-------------
temperature({c,N}) when N >= 20, N =< 50
-> 'fav';
temperature({k,N}) when N >= 293,N =< 318
-> 'sc fav';
temperature({f,N}) when N >= 68,N =< 113
-> 'fav in us';
temperature(_) -> 'fav in ceus'.
end.
看下运行结果:
14> temperature:temperature({c,20}).
fav
15> temperature:temperature({c,2000}).
'fav in ceus'
通过以上的介绍,我们知道可以有四种方式来处理if else 这种逻辑结构。
1. fun(Y) -> xx;
fun(X) -> yy;
fun(_) -> zz.
2. fun(X) ->
if X == 1 -> xx;
X == 2 -> yy;
true -> zz
end.
3. func(X) ->
if X == 1 -> xx;
X == 2 -> yy;
X != 1 , X != 2 -> zz
end.
4. func(X) ->
case X of
X == 1 -> xx;
X == 2 -> yy;
_ -> zz
end.
对于以上四种方式改如何选择呢?
1.从执行效率上看,四种方式没什么大的区别
2.第一种方式最扩张性最好,可以对于多个传递的参数进行处理。比如 f(A,B,C) ,如果对于用 case的话,只能传递数组的方式了 f({A,B,C})
3.单纯的if,从理解上来说最容易!
4.具体方式的选用还是看个人喜欢,更容易接受哪种!无强制要求
总之遵循一个原则:
Clean code is when you look at a routine and it's pretty much what you expected
分享到:
相关推荐
Erlang基础语法与函数定义 - **模块定义**: 在Erlang中,所有的代码都包含在模块之中。例如:`-module(tut).` 定义了一个名为`tut`的模块。 - **函数定义与导出**: 函数定义通常使用以下格式:`function_name...
【描述】虽然描述中没有具体的信息,但我们可以假设这是一个博主分享的关于Erlang学习的初步笔记,可能涵盖了基本语法、并发模型以及一些实用工具的使用。 【标签】"源码"和"工具"提示我们,这篇笔记可能包括了...
### Erlang学习笔记:深入解析Erlang编程与系统管理 #### 1. Erlang编程基础与资源 在深入探讨Erlang编程之前,我们首先需要了解一些基础资源和学习资料。Erlang官方网站([www.erlang.org](http://www.erlang.org...
Groovy是另一种基于JVM的动态编程语言,它的语法简洁,易于阅读和编写。Groovy与Java高度互操作,可以在现有的Java项目中无缝集成。Groovy的优点在于它支持闭包和元编程,使得代码更加简洁和可扩展。 Stackless ...
在学习RabbitMQ时,理解Erlang的基本语法和并发模型对深入理解RabbitMQ的工作原理很有帮助。 **三、Socat工具** Socat是一个命令行工具,用于建立各种网络连接。在RabbitMQ中,它有时被用来创建TCP隧道,帮助调试...
无论他们在哪里,都可以写文章,代码,笔记或与朋友见面。极限编程会议,辅导和创意写作的理想选择。 强大的编辑 细颗粒还原 可以按照您的方式执行撤消操作,而不必将太多的编辑分组在一起。 块编辑 同时在多行...
在描述中提到的“所有课程笔记”可能包含了一系列关于编程语言理论的详细记录,如语法规则、类型系统、编译器和解释器的工作原理、运行时环境等。这些笔记可能以PDF或Markdown格式存在,为学生提供了学习的核心资源...
5. **Erlang编程**:虽然Elasticsearch现在主要使用Java,但在早期版本中,Erlang是其基础。理解Erlang的并发模型和错误恢复机制可以帮助深入理解Elasticsearch的设计原则。 6. **数据集成**:"sample-elastic...
【描述】"帖子" 提示我们这个项目可能包含了一系列的文章或博客帖子,这些帖子可能涵盖了Erlang语言的学习笔记、EVM的内部工作原理、如何使用Erlang进行并发编程、Erlang在分布式系统中的应用,以及与SCSS(Sassy ...
【标题】"Lambda Days 2021演讲的幻灯片和文字代码——BEAM上的声音:分布式Lisp土地上的音乐"是一个关于在BEAM(Erlang虚拟机)上构建分布式系统的演讲,该演讲可能重点探讨了如何利用Lisp方言进行高效的分布式编程...
5. **笔记和讲解**:可能是讲师或学生整理的课堂笔记,涵盖了 Elixir 的高级主题,如 GenServer、Agent、Supervisor 和其他 OTP 组件的使用。 6. **资源链接**:可能还包括指向外部资源的链接,如官方文档、Elixir ...
2. **Markdown**: Markdown是一种轻量级的标记语言,用于格式化文本。它简单易学,能快速将纯文本转化为结构化的HTML文档,常用于编写README文件、笔记或在线文章。演讲可能讲解Markdown的基本语法、扩展特性和如何...
在IT行业中,Markdown因其简洁、直观的语法,广泛用于编写README文件、笔记、文档等。CommonMark是Markdown的一种标准化规范,旨在确保不同平台和工具间Markdown的兼容性。 `cmark.ex` 是一个基于Elixir的库,它...