Ruby语言介绍(三)——Ruby流程控制语句与实用数据处理

延续上一篇文章:

(3条消息) Ruby语言介绍(二)——Ruby基本语法(语言基础)_流鱼a_ec的博客-CSDN博客https://blog.csdn.net/m0_55401536/article/details/124870568?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22124870568%22%2C%22source%22%3A%22m0_55401536%22%7D&ctrtid=heUkm

模板

主题:x

阐述:y

目录

模板

主题:条件控制语句

主题:循环语句

主题:跳转控制

主题:实用数据处理

主题:数组

主题:字符串

主题:日期和时间

主题:正则表达式


主题:条件控制语句

阐述:条件控制语句又称为选择语句或者分支语句,用于判断一个表达式结果的真假(是否满足条件)。如果满足条件就执行该语句,否则不执行该语句。Ruby的条件控制语句有if语句、unless语句和case语句。

if语句

单条件if

if语句是使用最多的条件控制语句,它为条件代码的执行提供了一种便利的方法。在Ruby中它有很多的形式,族简单的语法格式表示“如果满足某种条件,就进行某种处理”。

if最简单的用法就是判断某个条件是否满足,其语法格式如下:

if  条件表达式  then

  语句块;

end

其中,条件表达式可以是任何一种逻辑表达式,如果返回结果为true,则程序先执行后面的大括号对({})中的执行语句,然后接着执行它后面的语句。如果返回结果为false,则程序跳过条件语句后面的执行语句。

双条件if

单条件if语句只能对一种情况做判断。对于该情况之外的其他情况无法做相应处理。如果在程序中,要对不符合条件的情况也做出处理,这是需要使用if else语句。

if else语句是对if语句的扩展,可以定义两个操作。

语法格式如下:

if  条件表达式  then

  语句块1;

else

  语句块2;

end

多条件if

if else只能判断两种情况,要么符合条件,要么不符合条件。如果有多种情况时,并且要求对每一种情况做出反应,if else语句就不能完成这样的作用。if elseif else结构如下:

if 条件表达式1 then

    语句块1;

elseif  条件表达式2  then

    语句块2;

  ...

  elseif 条件表式n  then

    语句块n;

  else

    语句块n+1;

end

执行此语句时,依次判断表达式的值。

if修饰句

在使用if语句时,还可以把if表达式放在整个表达式的右边。此时,只有当if块后边的条件成立时,才执行左边的表达式,并返回结果;若条件不成立则返回nil,通常称这种if语句使用方式为if修饰句。

unless语句

unless语句与if语句的作用正好相反,当条件表达式返回结果为假时,执行then关键字后的语句块。与if语句不同的是,unless语句中不能使用elsif语句,因此不能处理多分支的程序流程。

case语句

if语句每次判断只能实现两条分支,如果要实现多种选择的功能,那么可以采用case语句。case语句的作用是减少过多的if语句,并提供一个简洁的方法来处理对应给定表达式的多种情况。它根据一个控制表达式的值,case语句的基本语法形式如下:

case  表达式

    when  值1  then

        语句块1;

    when  值2  then

        语句块2;

    ...

    when  值n  then

        语句块n;

    else

        语句块n+1;

end

case语句在其开始处使用一个简单的表达式,表达式的结果与结构中的每个when子句的值进行比较。

注:需要注意case语句只计算一次开始处的一个表达式。

Ruby中将case关键字后表达式的值与各个常量做比较时,使用的是“===”比较运算符,而不是普通的“==”比较运算符。这样意味着when后面的常量可以是一个Range对象。当when后面是一个Range对象范围内,就可以执行对应的when语句块代码段。

主题:循环语句

阐述:循环语句又称为迭代语句,让程序重复执行某个语句块,知道某个特定的条件表达式结果为假时,结束执行语句块。在Ruby中循环语句的形式有:while语句、until语句、for in语句、loop语句和each语句

while语句

while循环是一种比较简单的循环,它指定了一个条件,在其嵌入代码结束执行前,必须满足这个条件。其格式如下:

while  表达式  do

  语句块;

end

使用while语句时,必须保证循环体内包含有条件表达式变为false的语句,否则将会形成死循环。

until语句

until语句与while语句的作用正好相反,当条件表达式返回结果为假时执行循环体,知道条件表达式为true为止。

格式如下:

until  条件表达式  do

    // 执行的语句块

end

until语句实现的功能与while语句相同。但是实现方式与while正好相反。

for in语句

Ruby提供的for in语句其实就是一种for each循环,主要用于迭代数组和Hash对象中的元素。使用for in语句中的语法格式如下所示:

for  变量名  in  集合  do

    执行语句;

end

变量名表示集合中的每一个元素,集合可以是数组或者hash对象。每次执行一次循环语句,循环变量就读取集合中的一个与严肃。直到为假才退出。

在使用for in时还可以一起指定多个循环变量,例如遍历Hash对象时,可以指定两个循环变量分别代表Hash对象的key和value。

注:使用for in语句时,每次只能取出一个数组元素,而不能一次取出多个,及时定义了多个循环变量。

loop语句

loop语句实际是Ruby的一个迭代器,它可以执行循环功能。当使用loop语句进行循环时,对指定的代码执行无限次循环,除非显示使用break语句跳出循环。

loop{

#循环器

}

也可以使用如下格式
 


loop do

#循环体

end

实际上,loop语句的两种语法格式完全统一,都是在loop后面使用一个块,然后对块进行循环,唯一区别就是表示方法不一样。在loop语句的循环体内,必须包含一个break语句来跳出循环,否则将形成死循环。

each语句

each语句也是Ruby的一个迭代器,用于将数组,Hash对象和普通对象的变量i进行遍历输出。

从上述程序中不难看出,这种迭代器对数组进行迭代操作的语法更符合面向对象的编程思想。

注:Ruby语言中的大部分内置类(例如Array、Hash和Range等)都可以使用迭代器。

主题:跳转控制

阐述:除了上述的条件语句和循环语句外,还有一种特殊的程序控制语句。

跳转语句用于需要程序从一个语句块转到另一个语句块的情况。

Ruby提供的跳转语句包括:break语句、next语句、redo语句和return语句。

break语句

在loop语句中,需要break语句来实现结束循环的功能。在while或until等循环中,只要Ruby解释器运行到break语句时,Ruby将完全跳出循环。如果break语句后有一个表达式,则需要该表达式的值将作为该循环表达式的值。

在循环嵌套时,内部循环中的break关键字只能终止内部循环,而不是跳出所有循环。

next语句

next语句与break语句功能有点相似,都用于结束循环。与break语句的区别在于,语句并不是中断循环语句,而是终止当前迭代的循环,进入下一个循环。next语句是忽略循环语句的当次循环。

额,突发了一个状况,那就是关于电子书的资源出了问题,本来以为是图书馆已经买了,没想到之前是免费试读。额……,于是在之后就买了一下电子书,地址如下:

额,不能上传了,还是私聊找我要吧。

redo语句

redo语句与next语句的功能相似,都是结束本次循环,开始下次循环。但是与next语句不同的是:next语句开始下次循环时,先检查循环条件是否成立,只有循环条件成立时,才会开始下次循环;redo却不再检查循环条件,直接开始下次循环。

注:在使用next语句和redo语句之前,首先必须对变量值进行更新,否则将会形成死循环。

return语句

除了break语句与next语句之外,return语句也可以用来终止循环。但是return语句并不是专门用于控制循环的语句,其主要作用是结束一个方法,并返回方法的返回值。

所以使用return语句终止循环只能在方法体内使用。如果在方法体的循环结构中使用了return语句,不管多少层次的嵌套,都会被终止,同事结束函数的运行。

主题:实用数据处理

阐述:Ruby与其他i编程语言一样,在程序中处理最多的就是与数据有关的信息。用户可以将数据存储在数组或字符串中,获取与日期、时间相关的数据。以及使用匹配数据,等等。

主题:数组

阐述:数组是存储一组数据对象的集合,可以通过一个索引标识来访问集合中的元素。在实际应用中,有效地使用数组可以很方便地进行数据处理。

Ruby数组中各元素的类型可以互不相同,而且数组的长度可变。

定义数组

Ruby定义数组有两种方式,第一种方式是直接在中括号[]将要包含的元素以逗号分隔来进行定义。

第二种方式是使用Array类的构造函数,创建Array类的实例。

colors=["蓝色","绿色","黑色"]

colors=Array.new

colors[0]="黑色”

定义数组后便可以用数组索引来访问数组中的元素。数组索引可以是正整数也可以是负整数。正索引数从0开始,负索引数从-1开始。

注:与其他语言不同,Ruby语言中可以使用size方法来访问数组的长度。

注:当使用正整数索引为数组元素赋值时,如果该数组元素不存在,则该数组自动加长,保证该数组元素有效,但是使用负整数索引来访问数组元素时,则必须引用一个已经存在的数组元素。

字符串转换成数组

Ruby中可以将一个包含多个空格的字符串转换成一个数组。Ruby会将空格作为字符串的分隔符,每个被空格分隔的子字符串会被当成一个数组元素。如果希望将包含多个空格的字符串转换成数组,则需要使用%w{...}或者%W{...}表示法。这两种表示法功能大致相同,只是使用%W{...}会对字符串中的转义字符和特殊字符进行替换。

添加数组元素

Ruby中每个数组都是Array类的实例。因此可以使用Array类的方法对数组进行添加和删除操作。这些方法主要有以下3个:

unshift方法:向数组的 头部添加数组元素;

push方法: 向数组的 尾部添加数组元素;

<<方法:向数组的 尾部添加一个数组元素。

注:使用unshift和push方法可以添加多个元素,但是使用<<方法只能添加一个元素。

删除数组元素

Array类提供了shift方法和pop方法来删除数组元素。这两个方法与unshift方法和push方法的功能正好相反,分别从数组头部和尾部删除一个数组元素,并且都返回被删除的数组元素。

截取数组

在Ruby中可以通过向Array[]中传递第二个参数来实现截取数组。这种方式主要有如下三种形式:

(1)array[n,m]:截取从索引n开始,长度为m的元素列表,组成新数组;

(2)array[n..m]:截取从索引n开始,到索引m的元素列表(包括索引为m的数组元素),组成新数组;

(3)array[n...m]:截取从索引n开始,到索引m的元素列表(不包括索引为吗的数组元素)。

合并数组

除了前面对数组的操作外,使用Array类的concat方法合并两个数组。

注:使用concat方法将永久改变被合并单数组的内容,如果不希望改变被合并数组的内容,可以使用符号“+”合并数组。

主题:字符串

阐述:

Ruby中的字符串是String类的实例。因此任意的字符串变量,常量都可以调用String类的实例方法。

定义字符串

定义一个字符串有很多种方式,其中最简单的是使用单引号和双引号。

虽然这两种方式都可以定义字符串,但是如果字符串中包含特殊字符,他们将产生不同的效果。使用单引号对括起来的字符串进行最少替换;而使用双引号则对括起来的字符串进行更多替换,例如替换转义字符和其他特殊字符。

Ruby中还提供了一种多行字符串的表示形式,这种语法也称为Here Document。语法格式如下:

<<标识符

字符串内容

标识符

结束的标识符必须从第一列开始,否则会引起错误。如果需要缩进结束标识符,可以在开始标识符的"<<"之后加上一个减号,即使用“<<-标识符”

替换字符串

Ruby中替换字符串最简单的方法就是调用replace方法,它有一个参数用于指定新字符串。使用replace方法后,新字符串将覆盖原始字符串的内容。

注:一旦创建好的字符串被replace替换,那么执行这个字符串的对象将发生改变。

复制字符串

使用String类的dup方法和clone方法可以复制字符串。其中dup方法只复制字符的内容,而clone除了复制字符串的内容,同时也继承了特殊方法等信息。

合并字符串

Ruby中合并两个字符串时,有如下两种情况:

(1)返回一个新的字符串,原有的字符串对象不变;

(2)改变原有字符串。

要创建由一个或多个字符串构成的新字符串,可以使用“+”操作符把多个字符串合并在一起。

注:在Ruby中对字符串变量、字符串或者其他字符串变量使用“+”进行合并操作时字符串变量的值不变。

在ruby中还可以使用“<<”操作符向原始字符串的尾部追加字符串。

在ruby中字符串还可以使用乘法运算,即一个字符串复制出相应倍数的字符串的副本。

获取字符和子字符串

在ruby中可以使用“[]”的方法读取字符串中的数字或子字符串。[]方法的参数时字符的索引,返回一个字符,如果为[]方法添加两个参数,还可以从字符串中获取指定长度的子字符串。

注:当字符串索引为正数的时候,表示从左开始计数,并且是从0开始的索引。当字符串为负数时,表示从右开始计数,并且是从-1开始索引。因为可以使用[]方法两种参数的形式获取任意长度的子字符串,所以可以获取一个长度为1的任何字符。

比较字符串的内容

比较字符串内容最简答的方法就是使用比较运算符中的“==”操作符。

Ruby还提供了eql?方法编辑两个字符串内容是否相等,它通常返回的结果与“==”操作符返回的结果相同。

在ruby中还可以使用equal?方法比较两个对象是否相同。

两个内容相同的字符串,可能是不同的对象。

比较字符串大小

在ruby中可以使用“<=>”运算符比较两个字符串的大小。当返回值为-1时,表示左边的字符串大,返回值为0时,表示两个字符串的内容相同,当返回值为1时,表示左边字符串大。

注:使用操作符比较两个字符串大小,实际比较的是字母的ASCII码。因为在Ruby总默认为所有皆为对象,所以用于比较爱哦字符串的方式,都可以运用于两个对象的比较。

改变字符串的内容

Ruby还为String类提供网络很多改变字符串内容的方式,像改变为大写、改变为小写、取出空格以及反转字符串内容等等。

改变字符串内容的方法

capitalize    将字符串首字母转换为大写

upcase    将字符串中所有字母转换为大写

downcase    将字符串中所有字母转换为小写

swapcase    将字符串中大写字母转换为小写,小写字母转换为大写

strip    去掉字符串中的首尾空格

lstrip    去掉字符串中左边的空格

rstrip    去掉字符串右边的空格

chop    删除字符串总的最后一个字符

chomp    删除字符串总最后的换行符

reverse    将字符串的字符反转

主题:日期和时间

阐述:日期和时间在实际编程中使用的频率非常高,像用户登录时间、产品发布时间和帖子恢复时间等。

Ruby定义了Time类来表示一个日期和时间对象,并且提供了很多用于操作日期和时间的方法。

定义日期和时间对象

当用户实例化一个Time类时,Ruby会放回一个包含当前日期和时间的对象。通过该实例的属性可以轻松地获取其中的年、月、日的信息。

使用Time.new只能创建当前的时间对象,而使用mktime方法和local方法来创建指定时间的对象。

mktime和local方法需要传递参数从而形成一个新的Time对象。传递的参数顺序一次为:年、月、日、时、分、秒、微秒。其中,除年参数是必须的外,其他参数均可选。

如果使用mktime方法和local方法传递参数时,如果没有传递可选参数,系统会自动的为时间对象赋值。

格式化日期

对日期对象进行格式化,主要通过strftime方法来实现。

如下为常用方法支持的格式化选项

%a        星期中天数的缩写,例如,“Sun”

%A        完整的星期中天数,例如,“Sunday”

%b        月名称的缩写,例如,“Jan”

%B        完整的月名称,例如,“January”

%c        等价于“%a%b%d%H:%M:%S:%Y”

%d        一个月中第几天(01~31)

%e        一个月中第几天

%H        以24小时制表示的时间(00~23)

%I        以12小时制表示的时间(1~12)

%m        月份(1~12)

%M        分(00~59)

%p        AM或PM

%S        秒(00~59)

%w        一星期中的第几天(星期日为0)

%x        等价于“%m%d%y”

操作日期对象

使用to_a方法可以将其他内容转换为数组,该方法同样适用于时间。但是与其他转换结果不同的是,to_a方法将日期转换的数组总是具有相同的元素,且每个元素都不是一个日期或者时间值。

数组下标对应的值

0    秒

1    分

2    小时

3    日期

4    月份

5    年份

6    星期

7    一年中的第几天

8    是否为夏令时间

9    时区

主题:正则表达式

阐述:在字符串中搜索某些字符串时,很多情况下用户并不能直接给出字符串的绝对内容。下面介绍如何在Ruby中定义正则表达式以及使用正则表达式验证数据。

定义正则表达式

正则表达式用来确定字符的某个模式,也可以指定一个固定的字符串。在Ruby中正则表达式是一个Regexp类实例。所以可以使用Regexp类的方法来匹配模式。下面姐介绍正则表达式的定义语法。

定界符

正则表达式必须用一对定界符括起来,Ruby使用一对斜线(/)作为定界符,例如/pattern/

在正则表达式中,除了定界符"/"之外,其他的“/”都需要添加反斜杠进行转义。

修饰符

在进行正则表达式匹配时,可能需要不区分大小写或只查找第一个相匹配的字符串等等。这些要求都可以通过使用正则修饰符来实现。如下所列:

i    不区分大小写进行匹配

m    将一个字符串视为多行。默认情况下,^和$字符串匹配字符串中的最开始和最末尾。使用m修饰符后将使^和$匹配字符串中每行的开始

s      将一个字符串视为一行,忽略其中的换行符,它与m修饰符正好相反。

x      忽略字符串中的空白和注释

U      第一次匹配后停止,即查找到第一个字符串后,停止后面的搜索。

/Hello/i

修饰符一般直接放在正则表达式的后面。

预定义字符

使用预定义字符可以设置正则表达式的匹配范围,预定义字符总是以一个反斜杠“\”开始,后面跟一个字母。

\A    只是匹配字符串开头

\b    匹配单词边界

\B    匹配除单词边界外的任意字符

\d    匹配数字字符,与[0-9]相同

\D    匹配飞数字字符

\s    匹配空白字符

\S    匹配非空白字符

\w    匹配任何只包含下划线和字母数字字符的字符串,与[a-zA-Z0-9]相同

\W    匹配没有下划线和字母数字字符的字符串

每个元字符智能匹配一个字符,如果匹配多个可以使用正则表达式的特殊字符。例如,下面的正则表达式可以匹配一个或多个数字字符:

中括号[]

在正则表达式中中括号表示在一定的范围内查找字符。可以在中括号内设置要查找的字符序列。

如下为正则表达式常用的字符范围

[0-9]    匹配任何从0到9之间的十进制数字

[a-z]    匹配任何从小写a到z的字母

[A-Z]    匹配任何从大写A到Z的字母

[A-Za-z]    匹配任何从大写A到小写z的字母

中括号所表示的范围,即中括号中出现的所有字符,为了方便,可以使用短横线连接两个字符来表示一个范围。

特殊字符

在中括号定义字符范围时有很明显的局限性。

正则中定义了一些特殊字符和表达式,用于简化类似复杂情况下的正则表达式写法

p+    匹配任何一个至少包含p的字符串

p*    匹配任何包含零个或者多个p的字符串

p?    匹配任何包含零个或一个p的字符串

p{2}    匹配任何包含2个p序列的字符串

p{2.3}    匹配任何包含2个或3个p序列的字符串

p{2,}    陪陪任何至少包含2个p序列的字符串

p$    匹配任何以p结尾的字符串

^p    匹配任何以p开头的字符串

正则表达式操作

在Ruby中可以使用match方法和=~运算符来判断定义的正则表达式是否与字符串匹配。

但是match返回的是MatchData的一个实例,而=~返回的是相匹配的字符串的位置。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王辞夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值