`

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

 
阅读更多

1.函数的语法:
基本上所有的编程语言都有

function greet (Gender,Name)
   if (condition1 )
     do something
   else if   (condition2)
     do other thing
   else
     do default behave
end
 

 

在erlang中是如何实现呢。
看下面的代码

-module(iff).
-export([greet/2]).

greet(male,Name) ->
  io:format('hello ,Mr ~s!',[Name]);
greet(female,Name) ->
  io:format('hello,Mrs ~s!',[Name]);
greet(_,Name)->
  io:format('hello,~s!',[Name]).

 

看下运行的结果:

1> iff:greet(male,zhaoming.xuezm).
hello ,Mr zhaoming.xuezm!ok
2> iff:greet(female,qiqi).
hello,Mrs qiqi!ok
3> iff:greet(xx,kiti).
hello,kiti!ok
 



其他语言中的if else 表达式

function(Args)
   if X then
      Expression
   else if Y then
      Expression
   else
      Expression
 


在erlang中的表达方式是:

function(X) ->
  Expression;
function(Y) ->
  Expression;
function(_) ->
  Expression.
  
 



注意点:
1.在erlang中对于这种条件的组转采用的 定义同样的函数名,但是通过分号(;)来区分不同的条件分支表达式。  分号(;)代表的是或(||) 逗号(,)代表是并且(&&)
2。~s :~代表的是占位符,s代表替换的是字符创。 其他还有的就是
   ~n <===> \n 换行符
   ~f <===>  浮点型数据
   ~p <===> 可以代替各种类型

  io:format('hello Mr ~s!',[Name]),
 io:format('the num is ~f',[2.3]);
----得到的结果是
5> iff2:greet(male,ming).
hello Mr ming!the num is 2.300000ok


 io:format('hello Mr ~s~n!',[Name]),
 io:format('the num is ~f',[2.3]);
----多了一个~n

3> iff2:greet(male,ming).
hello Mr ming!
the num is 2.300000ok
 



2.| 符号在list中的作用及变量的匹配

例子一:

-module(functions).
-compile(export_all).

head([H|_]) -> H.

second([_,H|_]) ->H.

third([_,_,H|_]) ->H.

------华丽的分割线-------
7> functions:head([1,2,3,4,5]).
1
8> functions:second([1,2,3,4,5]).
2
9> c(functions).                
{ok,functions}
10> functions:third([1,2,3,4,5]).
3
 


3.绑定变量和未绑定变量
先看个例子:

-module(same).
-compile(export_all).

same(X,X) ->
 true;
same(_,_) ->
 false.
 ------华丽的分割线-------
17> same:same(1,2).
false
18> same:same(1,1).                  //为什么输入1和1的时候是true呢
true
 


在erlang中,变量只能被赋值一次,赋值后不允许再次赋值,除非再赋值的值和原来相同!不可变。所以当调用 same(1,1)的时候,先将1赋值给了X,第二个参数也是X,再对X进行赋值的时候,就会进行匹配,若是相同的话,返回true,反之则返回false。

同理,不可以仅仅是对普通变量,其他的也是可以的!看下面的例子

1 -module(datev).
  2 -compile(export_all).
  3
  4 date_validate({Date={Y,M,D},Time={H,Min,S}}) ->                         //这里定义传入的是一个tuple
  5         io:format('the date is (~p) ~p/~p/~p,~n',[Date,Y,M,D]),
  6         io:format('the time is (~p) ~p:~p:~p,~n',[Time,H,Min,S]);
  7 date_validate(_) ->
  8   io:format('invalid date and time ~n').
 
  运行:
  25> datev:date_validate({{2011,8,23},{14,25,00}}).
the date is ({2011,8,23}) 2011/8/23,
the time is ({14,25,0}) 14:25:0,
ok
32> datev:date_validate({{2011,8,23}}).          
invalid date and time
ok
 


这里传入的是一个tuple,若是非tuple的话 则返回是另一个分支 invalid date and time

我们再看一个例子:

-module(tuple2).
-compile(export_all).


tt({XX,YY}) ->                //要求传入的是一个数组,数组中包含两个参数,若是格式不符合,则进入另一个分支
    io:format('this is a test ~p ~p',[XX,YY]);
tt(_) ->
    io:format('no result').
   
-------- 结果的分割线 --------
26> c(tuple2).
{ok,tuple2}
27> tuple2:tt({22,33}).
this is a test 22 33ok
28> tuple2:tt({22}).  
no resultok
29> tuple2:tt(33). 
no resultok
30> tuple2:tt(33,44).
** exception error: undefined function tuple2:tt/2
31> tuple2:tt([33]).
no resultok

 

通过以上两个例子,我们可以看到。对于传入的参数没有任何的限制,可以是任何的类型。不能做到精确的匹配!为了能做到精确的匹配,那么就需要下面这个角色出现!护卫。


4.guards
guards:为额外的子句,使得函数更具有表述性!
比如说需要定义一个函数,使得16岁以上的人才允许饮酒。按照我们之前学到的语法,那么需要这么定义!

old_enough(0) --> false;
old_enough(0) --> false;
old_enough(0) --> false;
....
old_enough(15) --> false;
old_enough(X) --> true;

这个时候就需要我们的guards出现了!
old_enough(X)when X >=16 -> true;
old_engouh(_) false.

-------- 解决方案的分割线 ----------
-module(old_enough).
-compile(export_all).

old_enough(X) when X >=16 ->
    true;
old_enough(_) ->
    false.
 


   
再看几个例子
判断一个人的年龄是否在一个正确的范围内!

-module(right_age).
-compile(export_all).

right_age(X) when X >= 18 , X < 65 ->      //注意这里用的是逗号,在这个表达式中逗号表示 &&
    true;
right_age(_) ->
    false
 



运行结果:

    37> c(right_age).
{ok,right_age}
38> right_age:right_age(33).
true
39> right_age:right_age(333).
false
 


判断年龄的另一种方式

-module(wrong_age).
-compile(export_all).

wrong_age(X) when X < 18 ; X> 60  ->   //这里用的是分号,在这个表达式分号,分号代表的是 || 或
    true;
wrong_age(_) ->
    false.
 



结果:

40> c(wrong_age).
{ok,wrong_age}
41> wrong_age:wrong_age(3).
true
42> wrong_age:wrong_age(33).
false
 

 

分享到:
评论

相关推荐

    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...

    Erlang程序设计(第2版)读书笔记:Erlang安装和基础语法

    Erlang是一种专门用于并发计算的高级编程语言,由瑞典爱立信公司开发。它尤其适合于开发分布式、高可用性和容错性的系统。Erlang语言以其独特的并发模型、轻量级进程、消息传递和分布式计算能力闻名,非常适合处理...

    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

    在Dendron中,用户可以使用Markdown语法创建和编辑笔记。 5. **Erlang编程**:虽然Elasticsearch现在主要使用Java,但在早期版本中,Erlang是其基础。理解Erlang的并发模型和错误恢复机制可以帮助深入理解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

    4. **项目作业**:如果这是课程的一部分,那么可能包含一些练习或项目作业,让学生应用所学知识,解决实际问题,比如构建一个简单的Web服务器、消息队列系统或处理并发任务。 5. **笔记和讲解**:可能是讲师或学生...

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

    3. **Elixir**: Elixir是基于Erlang虚拟机(BEAM)的函数式编程语言,适用于构建高并发、分布式和容错系统。Elixir具有强大的处理并发的能力,是构建实时系统和大型Web服务的理想选择。演讲可能涵盖Elixir的基础、...

    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