`

erLang学些笔记5--条件判断语法2

 
阅读更多

一: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基础语法与函数定义 - **模块定义**: 在Erlang中,所有的代码都包含在模块之中。例如:`-module(tut).` 定义了一个名为`tut`的模块。 - **函数定义与导出**: 函数定义通常使用以下格式:`function_name...

    erlang 学习笔记1

    【描述】虽然描述中没有具体的信息,但我们可以假设这是一个博主分享的关于Erlang学习的初步笔记,可能涵盖了基本语法、并发模型以及一些实用工具的使用。 【标签】"源码"和"工具"提示我们,这篇笔记可能包括了...

    erlang学习笔记

    ### Erlang学习笔记:深入解析Erlang编程与系统管理 #### 1. Erlang编程基础与资源 在深入探讨Erlang编程之前,我们首先需要了解一些基础资源和学习资料。Erlang官方网站([www.erlang.org](http://www.erlang.org...

    Scala、Groovy++、Stackless Python、Erlang 学习笔记及分享

    Groovy是另一种基于JVM的动态编程语言,它的语法简洁,易于阅读和编写。Groovy与Java高度互操作,可以在现有的Java项目中无缝集成。Groovy的优点在于它支持闭包和元编程,使得代码更加简洁和可扩展。 Stackless ...

    rabbitmq学习笔记和软件和插件

    在学习RabbitMQ时,理解Erlang的基本语法和并发模型对深入理解RabbitMQ的工作原理很有帮助。 **三、Socat工具** Socat是一个命令行工具,用于建立各种网络连接。在RabbitMQ中,它有时被用来创建TCP隧道,帮助调试...

    SubEthaEdit-5.1.3.zip 可以写文章,代码,笔记

    无论他们在哪里,都可以写文章,代码,笔记或与朋友见面。极限编程会议,辅导和创意写作的理想选择。 强大的编辑 细颗粒还原 可以按照您的方式执行撤消操作,而不必将太多的编辑分组在一起。 块编辑 同时在多行...

    compsci390-plp

    在描述中提到的“所有课程笔记”可能包含了一系列关于编程语言理论的详细记录,如语法规则、类型系统、编译器和解释器的工作原理、运行时环境等。这些笔记可能以PDF或Markdown格式存在,为学生提供了学习的核心资源...

    sample-elasticsearch-demo

    5. **Erlang编程**:虽然Elasticsearch现在主要使用Java,但在早期版本中,Erlang是其基础。理解Erlang的并发模型和错误恢复机制可以帮助深入理解Elasticsearch的设计原则。 6. **数据集成**:"sample-elastic...

    ericssonaxel.github.io:evm.com

    【描述】"帖子" 提示我们这个项目可能包含了一系列的文章或博客帖子,这些帖子可能涵盖了Erlang语言的学习笔记、EVM的内部工作原理、如何使用Erlang进行并发编程、Erlang在分布式系统中的应用,以及与SCSS(Sassy ...

    演示文稿:Lambda Days 2021演讲的幻灯片和文字代码-BEAM上的声音:分布式Lisp土地上的音乐

    【标题】"Lambda Days 2021演讲的幻灯片和文字代码——BEAM上的声音:分布式Lisp土地上的音乐"是一个关于在BEAM(Erlang虚拟机)上构建分布式系统的演讲,该演讲可能重点探讨了如何利用Lisp方言进行高效的分布式编程...

    Walter3semestre

    5. **笔记和讲解**:可能是讲师或学生整理的课堂笔记,涵盖了 Elixir 的高级主题,如 GenServer、Agent、Supervisor 和其他 OTP 组件的使用。 6. **资源链接**:可能还包括指向外部资源的链接,如官方文档、Elixir ...

    演讲:我做过的技术演讲集

    2. **Markdown**: Markdown是一种轻量级的标记语言,用于格式化文本。它简单易学,能快速将纯文本转化为结构化的HTML文档,常用于编写README文件、笔记或在线文章。演讲可能讲解Markdown的基本语法、扩展特性和如何...

    cmark.ex:c cmark(C)的Elixir NIF,遵循CommonMark规范的解析器库,Markdown的兼容实现

    在IT行业中,Markdown因其简洁、直观的语法,广泛用于编写README文件、笔记、文档等。CommonMark是Markdown的一种标准化规范,旨在确保不同平台和工具间Markdown的兼容性。 `cmark.ex` 是一个基于Elixir的库,它...

Global site tag (gtag.js) - Google Analytics