if 與 unless


要某條件成立時才進行某些動作,Ruby提供了if運算式,一個例子如下:
filename = "default.properties"
if ARGV[0]
filename = ARGV[0]
end
puts filename

這 個範例中,預設的檔案名稱是default.properties,如果使用者有提供命令列引數,則ARGV[0]就會有值,而不會是nil,在if判斷中會被當作真,所以if條件成立,將filename設定為使用者所提供的命令列引數。

if可以搭配else,在if條件不成立時,執行else中定義的程式碼,所以上例也可以這麼寫:
if ARGV[0]
filename = ARGV[0]
else
filename = "default.properties"
end
puts filename

如果有多重判斷,則可以使用if..elsif..else結構。例如:
# encoding: Big5
print "輸入分數:"
score = gets.to_i
if score >= 90
puts "得 A"
elsif score >= 80 and score < 90
puts "得 B"
elsif score >= 70 and score < 80
puts "得 C"
elsif score >= 60 and score < 70
puts "得 D"
else
puts "不及格"
end

如果要在一行中撰寫if判斷,則if之後必須使用then或分號。例如:
filename = "default.properties"
if ARGV[0] then filename = ARGV[0] end
puts filename

Ruby中程式碼需換行的地方,也可以使用分號,所以也可以這麼寫:
filename = "default.properties"
if ARGV[0]; filename = ARGV[0] ;end
puts filename

再來看個使用分號的例子,不過這樣可讀性就不好了:
if ARGV[0]; filename = ARGV[0]; else filename = "default.properties";  end
puts filename

if有個可傳回值的使用方式:
filename = "default.properties"
filename = ARGV[0] if ARGV[0]
print filename

上例中,只有在if判斷成立時,filename才會被設定為ARGV[0]。

Ruby中有if,也有unless。if條件成立才會執行區塊內容,unless則相反,條件不成立才會執行區塊,if是如果條件成立就執行區塊,unless是除非條件成立,否則就執行區塊。

一個例子如下:
# encoding: Big5
print "輸入正數:"
number = gets.to_i
unless number >= 0
number = -number
end
puts number

這個例子中,使用者必須輸入0以上的正數,如果使用者輸入負數,要轉為正數,所以使用unless,除非輸入的數大於等於0,否則就使用-轉為正數。

unless也可以搭配else。例如:
unless ARGV[0]
filename = "default.properties"
else
filename = ARGV[0]
end
puts filename

除非使用者有提供命令列引數,否則filename就設定為"default.properties",要不然filename就設定為使用者提供的命令列引數。

如果要在一行中撰寫unless判斷,則unless之後同樣必須使用then或分號。例如:
# encoding: Big5
print "輸入正數:"
number = gets.to_i
unless number >= 0 then number = -number end
puts number

unless也有個可傳回值的使用方式:
filename = "default.properties"
filename = ARGV[0] unless !ARGV[0]
print filename