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

 

posted @ 2020-05-28 01:05  就是想学习  阅读(154)  评论(0编辑  收藏  举报