分支指令及邏輯運算

林品儒

2016/10/21

本日重點

比較運算

分支指令

邏輯運算

特殊用法

比較運算

比較運算

可以在不同物件之間比較

可以有相等或是大小之分

相等比較

在Ruby中有不同種類的相等比較

最簡單的就是比較兩個物件的值

也可以比較兩個物件是否為同個物件

還有更廣的比較

不相等

兩個物件值不一樣就是不相等

!=

反而相等的狀況更為複雜...

相等

比較兩個物件的值是否相等

== (注意不是賦值的單一"="號)

比較兩個物件的值和類別是否相等

eql?

比較兩物件是否為同一物件

equal?

物件id

之前有提到物件其實就在記憶體某處

物件的ID就代表了物件的位置(指標)

藉由比較ID可以判斷兩物件是否為同一物件

牛刀小試

1==1.0

1.eql? 1.0

[].equal? []

物件id補充

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

最簡單的分支指令

if(cond)[then]
  do_something
end

條件符合才做事

then可省略且一定要加上end

if/else

二選一

if(cond)[then]
  do_something
else
  do_others
end

再次提醒不要忘了end

if/elsif/else

可以有很多種選擇

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

可以在條件不符時做事

unless(fail)[then]
  do_something
end

可以用來確保失敗時做些處理

unless/else

也是二選一

unless(fail)[then]
  do_something
else
  do_others
end

就是個反向的if/else

沒有多重條件不符合時的判斷歐

牛刀小試

紅茶已經40元是否該漲價?

提示:unless,10<40

大人快鍘他!!

提示:unless/end,"Y"/"N"

多重條件比對

有時候elsif寫起來實在不明確

比對列舉的條件

該是關聯運算子出場的時候了

case/when/else/end

可以和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

只想在某些狀況下執行單行指令

在指令後面加上if和條件就可以了

do_something if cond

後綴unless

否定版的後綴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其實有神奇的妙用

可以用來取代簡單的判斷

部份狀況下比後綴的條件有可讀性

and

若是條件符合則做後面的事

用來取代if

data and porcess(data)

or

條件不符合則做後面的事

用來取代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

特殊用途其實不一定是最好的寫法

但是懂了之後需要時就能用上

希望大家技術都更加提升了

感謝各位