《Rubu基础教程第五版》第五章笔记 条件判断
条件判断 if unless case 比Python复杂,Python就一个if
32 shijianzhongdeMacBook-Pro:chapter_5 shijianzhong$ cat ad2pingcheng.rb ad = ARGV[0].to_i pingcheng = ad - 1988 p pingcheng shijianzhongdeMacBook-Pro:chapter_5 shijianzhong$
Ruby中的条件
Ruby中的假只有nil与false ,另外的都是真
返回真假的方法后面都带?问号
逻辑运算符 && || ! 相同与 and or not 这个Ruby里面也有,单优先级比较低
if语句,跟shell脚本比较像,有一个then 但可以省略,shell里面不可以省略
if condition then
runing
elsif condition r=then
runing
else
runing
end
上示例代码
shijianzhongdeMacBook-Pro:chapter_5 shijianzhong$ cat if_elsif.rb a = 10 b = 20 if a > b then puts "a比b大" elsif a< b then puts "a比b小" else puts "a与b相等" end shijianzhongdeMacBook-Pro:chapter_5 shijianzhong$
unless 语句
unless condition then
runing
end
代码如下
shijianzhongdeMacBook-Pro:chapter_5 shijianzhong$ cat unless.rb a = 10 b = 20 unless a > b then puts "a不比b大" else puts "else这里来了" end shijianzhongdeMacBook-Pro:chapter_5 shijianzhong$
unless没有elsif的选项
case 语句 这里的then也可以省略,感觉ruby的then差不多都可以省略
case 对象
when 值1 then
running
when 值2 then
runing
when 值3,值4 then
running
else
running
end
when里面可以添加多个选项,只要适配都会输出,第一次匹配过以后,第二次同样的值也不会匹配
shijianzhongdeMacBook-Pro:chapter_5 shijianzhong$ cat case.rb tags = ["A", "IMG", "PRE" ] tags.each do |tagname| case tagname when "p", "A", "IMG" puts "#{tagname} has child" else puts "#{tagname} cannot be used" end end
case还可以直接适配对象的是否是该类的实例
item is String item is Object item is Object item is Object shijianzhongdeMacBook-Pro:chapter_5 shijianzhong$ cat case_class.rb arr = ["a", 1, [], nil] arr.each do |item| case item when String then puts "item is String" when Object then puts "item is Object" when Numeric then puts "item is a Numeric" else puts "item is someting" end end shijianzhongdeMacBook-Pro:chapter_5 shijianzhong$
经过测试,这个类的范围要写的少,我写的比较大,用Object,直接把基本的实例都包含进去了,说明父类也可以
书中有一个很好的通过正则的方式匹配的代码,抄写一下
text.each_line do |line| case line when /^From:/i then puts "发现收件人信息" when /^To:/! then puts "发现收件人信息" when /^Subject:/i then puts "发现主题信息" when /^$/ puts "头部解析完毕" else exit end end
可以通过匹配每一行的信息来判断邮件的头信息
===与case
==双=号表示两边值是否相等
但===这个可以跟=~一样来完成正则匹配,还可以判断右边的对象是不是左边的值
>> p /zz/ === "zyzzy" true => true >> p String === "zyzzy" true => true >> p (1..5) === 3 true => true >>
所有就有了下面的case 语句转换成if语句的写法
case value
when A then
...
when B then
...
else
...
end
转换成if的格式
if A === value then
..
elsif B === value then
...
else
...
end
if 修饰符 与 unless 修饰符
>> a = 1 if 1>2 => nil >> a => nil >> a => nil >> a = 1 unless 1>2 => 1 >> a => 1 >>
前面一个执行条件,只有后面的条件满足,前面的才执行
补充知识
对象的同一行 通过.object_id或__id__可以查看对象的id,好比Python中的id函数
通过.equal?来查看两个对象是否是同一个id ,跟Python中的is差不多
.eql?也是来判断值相等的,大多数情况下与==效果相等,但1.0=1情况另外
上代码
>> str1 = "foo" => "foo" >> str2 = str1 => "foo" >> str3 = "f" + 'o' + 'o' => "foo" >> p str1.equal?(str2) true => true >> p str1.equal?(str3) false => false >> p str1.eql?(str3) true => true >>
>> a = 1 => 1 >> b = 1.0 => 1.0 >> a == b => true >> a.eql?(b) => false >>
>> hash = {0 => "oo"} => {0=>"oo"} >> hash[0] => "oo" >> hash[0.0] => nil >>