免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2363 | 回复: 2
打印 上一主题 下一主题

Ruby学习笔记-循环与选择结构 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-18 17:06 |只看该作者 |倒序浏览
Ruby学习笔记-循环与选择结构












一、循环结构
1.    for…in语句:
Ruby提供的for...in语句主要用于迭代数组和Hash对象中的元素,与其它语言的for语句有一定的差距,语法格式:
  1. for val  in  Array | Hash | Range [do]

  2.               #code

  3. end
复制代码
----------------------------------------------------
迭代数组:
  1. for i in ['one','two','three'] do  
  2.       puts i
  3.   end
复制代码
迭代Hash对象:
  1.      h = {1=>'aaa',2=>'bbb'}
  2.       for i in h                                         
  3.           puts i[0] .to_s + “ : ” +i[1].to_s
  4.       end
复制代码
OR------------------------------------------
  1.      for key,value in h                                          #指定多个循环变量
  2.           puts key.to_s + ": "+ value.to_s
  3.       end
复制代码
------------------------------------------------------

另外,在Ruby中除了可以用for…in来迭代数组和Hash对象外,还可以用each方法来进行迭代:
  1. ['one','two','three'].each do |x|  
  2.     puts x

  3. end
复制代码
----------------------------------------
  1. {1=>'aaa',2=>'bbb'}.each do  |a,b|  
  2.       puts a.to_s + ": " +b.to_s

  3. end   
复制代码
Note:
(1)使用for…in语句时,每次只能取出一个数组元素,而不能一次取出多个。
(2)当for循环的代码全在一行上时不能省略掉do,否则会报错; 只有当for循环的代码在多行上时才可以省略掉do;

2.       Blocks:
在Ruby中有两种定义块的方法:
  1. do…end 和{…}
  2. #do…end
  3. [‘1’,’2’,’3’].each do  |a,b,c|
  4.      Puts(‘#{a},#{b},#{c}’)
  5. end
复制代码
  1. # 大括号 {..}

  2. [[1,2,3],[3,4,5],[6,7,8]].each{  |a,b,c|  
  3.      puts( "#{a}, #{b}, #{c}" )

  4. }
复制代码
Note: 不管我们用哪种方式定义一个块,我们都必须确保’do’或’{’要和each关键字放在同一行上,否则会出现语法错误

3.       While语句:
这个和其它语言差别不大,没什么好说的,语法格式如下:
  1. while condition [do]

  2.         #code

  3. end
复制代码
----------or------------------------     
code while condition
在这要提一下的是上面的第二种定义,代码会先执行一次然后在进行判断。如果我们想用这种方式执行很多句代码,可以把它们放在begin和end之间:
  1. begin

  2.      code1

  3.      code2

  4. end while condition
复制代码
Note: 当一个块被在begin和end之间时(如上),那么这段代码到少会执行一次,其它格式定义的while循环里面的代码可能执行0或多次;
  1. x=100
  2. begin  
  3.      puts("x=#{x}")
  4. end while(x<100)                        #output:x=100
  5. puts ("-------------------")
  6. y=100

  7. puts("y=#{y}") while(y<100)              #无输出
复制代码
4.       until语句
until语句与while语句作用正好相反,当条件表达式返回结果为假时执行循环体,直到条件表达式为true为止,语法格式:
  1. until condition [do]

  2.        #code

  3. end
复制代码
unitl语句的功能完全可以由wihle语句来实现,大多数其它语言中也没有until语句,感觉用起来容易出错,本人还是喜欢用while;

5.       Loop 语句
这是Ruby中提供的一个内建的最基本的迭代器,它可以执行循环功能,它会对指定代码进行无限次的循环,除非使用break语句跳出循环,语法格式:
  1. loop{

  2.        #code

  3. }

  4. -------------------or------------------------     
  5. loop do

  6.        #code
复制代码
end
二、选择结构
  1. 1.       If…Then…Else/If…:…then(可以用冒号代替Then)
  2. if x == 1 then puts( 'ok' ) end # with 'then'
  3. if x == 1 : puts( 'ok' ) end # with colon
  4. if x == 1 puts( 'ok' ) end # syntax error!代码在一行时不能省略then
复制代码
2.       And…Or…Not/&&…||…!
Ruby中有两种方式来判定一个布尔表达式的值是true/false,但是这两种操作符不是完全等价的,比如他们的计算优先级别就不一样,&&/||/!的优先级别要高些,所以一般用的时候尽量不要将这两种操作符混合起来用;
  1. if 1==2 and 2==3 or (||)3==3  
  2.    puts('hello')   
  3. end
复制代码
--------------------or------------------------
  1. if 1==2 && 2==3 || 3==3
  2.    puts('world')   
  3. end
复制代码
3.       Unless
该语句与if语句作用正好相反,当条件表达式返回结果为假时,计算then关键字后的代码片段,与if语句不同的是,unless语句中不能使用elsif语句,因些不能处理多分支的程序流程,语法格式如下:
  1. unless  condition [then]

  2.               #code1

  3.        [else
  4.                #code2    ]
  5. end
复制代码
4.       Case Statements
在Ruby中,将case关键字后表达式的值与各个常量进行比较时,使用的是”===”比较运算符,这就是说when关键安后的常量可以是一个Range对象, 此时只要case后的表达式的值在Range内,就可以执行相应的when后的代码片段了; 语法格式:

case [表达式]
  1. [when 常量1 [,常量2] [,常量] then
  2.         #code1
  3. ]
  4. [when 常量1 [,常量2] [,常量] then
  5.         #code2
  6. ]
  7. [else
  8.         #code3
  9. ]
  10. end
复制代码
在case语句中,将case关键字后的表达式的值依次与when后的多个常量进行比较,一但相等,则执行对应的when语句块中的代码片段;
case(i)

  1.         when 1: puts(“It’s Monday”)

  2.         when 2: puts(“It’s Tuesday”)

  3.         when 3: puts(“It’s Wednesday”)

  4.        when 4: puts(“It’s Thursday”)

  5.         when 5: puts(“It’s Friday”)

  6.         when (6..7): puts(“It’s the weekend!”)

  7.         else puts(“error”)

  8. end  
复制代码
------------------or------------------------
  1. case(i)

  2.         when 1

  3.                 puts(“It’s Monday”)

  4.         when 2

  5.                 puts(“It’s Tuesday”)

  6.         when 3

  7.                 puts(“It’s Wednesday”)

  8.         when 4

  9.                 puts(“It’s Thursday”)

  10.         when 5

  11.                 puts(“It’s Friday”)

  12.         when (6..7)

  13.                 puts(“It’s the weekend!”)

  14.         else

  15.                 puts(“error”)
  16. end   
复制代码
另外,当匹配成功后我们不需要为输入break语句来退出case语句,在Ruby中,一量匹配成功,case语句会自动跳出。

论坛徽章:
0
2 [报告]
发表于 2011-12-19 11:24 |只看该作者
学习学习

论坛徽章:
0
3 [报告]
发表于 2011-12-19 18:02 |只看该作者
需要学习学习。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP