比較運算
分支指令
邏輯運算
特殊用法
可以在不同物件之間比較
可以有相等或是大小之分
在Ruby中有不同種類的相等比較
最簡單的就是比較兩個物件的值
也可以比較兩個物件是否為同個物件
還有更廣的比較
兩個物件值不一樣就是不相等
!=
反而相等的狀況更為複雜...
比較兩個物件的值是否相等
== (注意不是賦值的單一"="號)
比較兩個物件的值和類別是否相等
eql?
比較兩物件是否為同一物件
equal?
之前有提到物件其實就在記憶體某處
物件的ID就代表了物件的位置(指標)
藉由比較ID可以判斷兩物件是否為同一物件
1==1.0
1.eql? 1.0
[].equal? []
Ruby有不佔用記憶體空間的立即值
2.0以前:Fixnum,Symbol,true,false,nil
2.0開始:多了部份Float
1.0.equal? 1.0
1.9656826079092814e-236.equal? 1.9656826079092814e-236
可以表達一個整數的區間
兩個數字中間放入".."或"..."
1..5意為[1,5]
1...5則意為[1,5)
其實就是 ===
可以檢查兩物件間的多個條件是否有符合者
不會直接拿出來用但是會用到
(1...10)===9.5
Integer===0xC8763
數字之間能互相比大小
字串之間也可以比大小
但是數字和字串不能比大小
小心兩個物件的類別
<:小於
>:大於
<=:不大於
>=:不小於
<=>:看前後的大小回傳1,0,-1
'Z'>'B'
'Z'>'b'
'100'<=100
11<10.9
在此堂課之前程式只能循序執行
利用分支指令可以在不同條件下執行不同程式
最簡單的分支指令
if(cond)[then]
do_something
end
條件符合才做事
then可省略且一定要加上end
二選一
if(cond)[then]
do_something
else
do_others
end
再次提醒不要忘了end
可以有很多種選擇
if(condA)[then]
do_things_A
elsif(condB)[then]
do_things_B
...
[else
do_others]
end
else不一定要出現且注意是elsif
之後的程式碼會超過1行以上
單純使用irb無法修改也不方便使用
先在編輯器上寫好再貼上irb吧
直接執行外部檔案又是另外的故事了
讓輸入的不及格成績及格吧
提示:變數,gets,to_i,if
血量100的始萊姆受到外在傷害使否斃命呢?
提示:減法,if/else
聽說大家手上拿的刀子數目不太一樣
拿了1,2,3,9,54把刀的各是什麼來頭
提示:if/elsif/else
可以在條件不符時做事
unless(fail)[then]
do_something
end
可以用來確保失敗時做些處理
也是二選一
unless(fail)[then]
do_something
else
do_others
end
就是個反向的if/else
沒有多重條件不符合時的判斷歐
紅茶已經40元是否該漲價?
提示:unless,10<40
大人快鍘他!!
提示:unless/end,"Y"/"N"
有時候elsif寫起來實在不明確
比對列舉的條件
該是關聯運算子出場的時候了
可以和if/elsif/else視情況選用
case(obj)
when val_A [then]
do_things_A
...
else
do_others
end
一樣then可以省略且記得要加上end
來把成績轉換成等第
0~59為F
60~69為D
70~79為C
80~89為B
90~99為A
100為A+
試想用if/elsif/else怎麼寫
極度省略的if/else替代方案
(cond)? correct : fail
注意其中的":"前後最好都留空格
不要濫用影響可讀性
只想在某些狀況下執行單行指令
在指令後面加上if和條件就可以了
do_something if cond
否定版的後綴if
do_somthing unless fail
輸入的數字是否為非負整數
提示:gets,to_i,三元運算子
exit if Math.is_a?(Class)
可以用來對真假值運算
讓條件可以更為複雜
簡化不必要的分支指令
TT→T
FT→F
TF→F
FF→F
and 和 && 都可以做"且"的運算
TT→T
FT→T
TF→T
FF→F
or 和 || 都能做"或"的運算
TT→F
FT→T
TF→T
FF→F
只有 ^ 可以做互斥"或"的運算
T→F
F→T
有not和 ! 可以使用
注意這個運算是要放在物件前面
程式中對於各運算子的優先度是不太一樣的
乘除>加減>比較>^>&&==||>賦值>not>and==or
不確定時可以使用小括號確保先行計算
觀察兩個指令執行後cond的值
cond=true and false
cond=true && false
and和or其實有神奇的妙用
可以用來取代簡單的判斷
部份狀況下比後綴的條件有可讀性
若是條件符合則做後面的事
用來取代if
data and porcess(data)
條件不符合則做後面的事
用來取代unless
data or initialize(data)
true and print("Sucess")
false or print("Fail")
true ^ p("whatever")
false ^ p("whatever")
不只and和or有特殊的功用
他們的近親&&和||也有
可以在變數沒有給予值時給予值
但是變數已有值時不會更改
data=data||init_data
data||=init_data
這個想不出好名字
可以在變數已經有值時給予新值
但是沒東西時就不會給
data=data&&new_data
data&&=new_data