If..Then..Else

if_else.rb

像这样的简单测试只会是两个可能的结果之一。要么运行一部分代码,要么不运行,取决于测试结果是否为 true。通常,你会需要有两种以上可能的结果。例如,假设你的程序在这一天为工作日时执行一种程序行为,如果是周末则执行不同的程序行为。你可以在 if 部分之后添加 else 部分来测试这些条件,如下所示:

  1. if aDay == 'Saturday' or aDay == 'Sunday'
  2. daytype = 'weekend'
  3. else
  4. daytype = 'weekday'
  5. end

这里的 if 条件很简单。它测试了两种可能性:1)变量 aDay 的值等于字符串 “Saturday”,或 2)等于字符串 “Sunday”。如果其中任何一个条件为真,则执行下一行代码:daytype ='weekend'; 在所有其它情况下,else 之后的代码将执行:daytype ='weekday'

if_then.rb
如果 if 测试和要执行的代码在不同行,关键字 then 是可选的。但是,当测试语句和要执行代码在同一行时,关键字 then(或者你喜欢更简洁的代码,一个冒号)是必要的: if x == 1 then puts( ‘ok’ ) end # with ‘then’ if x == 1 : puts( ‘ok’ ) end # with colon if x == 1 puts( ‘ok’ ) end # syntax error!

if 测试不仅限于两个条件的判断。例如,假设你的代码需要确定某一天是工作日还是节假日。所有的周内每一天都为工作日,所有的星期六都是假期,但周末只有你不加班时才是假期。这是我第一次尝试编写测试来判断所有的这些条件:

and_or_wrong.rb
  1. working_overtime = true
  2. if aDay == 'Saturday' or aDay == 'Sunday' and not working_overtime
  3. daytype = 'holiday'
  4. puts( "Hurrah!" )
  5. else
  6. daytype = 'working day'
  7. end

不幸的是,这并没有达到预期的效果。请记住,星期六总是一天假期。但是,这段代码却认定星期六是工作日。这是因为 Ruby 接收的测试为:“如果这一天是星期六并且我不加班,或者这一天是周末并且我不加班”,但我真正的意思是:“如果这一天是星期六,或者这一天是周末并且我不加班”。解决这种歧义的最简单方法是在任意代码周围加上括号使其作为单个单元进行判断,如下所示:

and_or.rb
  1. if aDay == 'Saturday' or (aDay == 'Sunday' and not working_overtime)