Ruby bits ( 1 ) : Expression

Unless

Unless is more intuitive

用 unless 代替 if! 更加直覺

Unless with else is confusing

unless 和 else 一起用的時候令人困惑

NIL

NIL IS FALSE

因為 nil 的值等於 false 所以上面的程式可以簡化成下面這樣。

ONLY NIL IS FALSE

Rails 世界中只有 nil 的值是 false(除了 False 本身的值當然是 False 以外)。

inline condition

short circuit assignment

指的是使用 and(&&) 和 or(||)來縮減 if-else

Ex1 : if nil, default to empty array

Ex2 : sign in

一個常見的例子是用在「判斷使用者有沒有登入」,如果 session 中有 user_id 就去找到相對的 user。 session 中沒有找不到 user_id 時才導向登入畫面。

1
2
3
def sign_in
current_session || sign_user_in
end

conditional assignment

現在有一個敘述i_was_set ||= 2它的意思是如果 i_was_set 這個變數還沒被 assign 值,那就設定為2(下方的例子)。如果已經被 assign了值,i_was_set 的值保持原來 assign 的值(上方的例子)。

再看一個例子,如果變數未指定的話就會設成後面的值。

conditional return values

利用 =if 來減少重複的程式碼。原理是再function中裸寫出一個值時,其實意義上等於 return 剛剛寫下的那個值。舉例來說

1
2
3
4
5
if list_name
"/#{user_name}/#{list_name}"
else
"/#{user_name}"
end

會回傳"/#{user_name}/#{list_name}""/#{user_name}",所以如果寫下

1
2
3
4
5
options[:path] = if list_name
"/#{user_name}/#{list_name}"
else
"/#{user_name}"
end

其實就等於

1
2
3
4
5
if list_name
options[:path] = "/#{user_name}/#{list_name}"
else
options[:path] = "/#{user_name}"
end

上式先判斷listname的值,再指定給option[:path],下式也是先判斷list_name的值,再指定給 option[:path]。可以發現兩者邏輯是相同的,只是書寫的方式看起來不同。

conditional return values (ex2)

1
2
3
4
5
6
7
8
def list_url(user_name, list_name)
if list_name
url = "https://twitter.com/#{user_name}/#{list_name}"
else
url = "https://twitter.com/#{user_name}"
end
url
end
1
2
3
4
5
6
7
def list_url(user_name, list_name)
if list_name
"https://twitter.com/#{user_name}/#{list_name}"
else
"https://twitter.com/#{user_name}"
end
end

CASE

case 的用法跟java不太一樣,但是其實意義上有點類似,ruby裡面的case流程判斷的else就是java裡面switch流程判斷的default。然後java設定條件的地方用關鍵字 case 而 ruby 用關鍵字 when。

CASE RANGES

1
2
3
4
5
6
7
8
popularity = case tweet.retweet_count
when 0..9
nil
when 10..99
"trending"
else
"hot"
end

CASE - REGEXPS

1
2
3
4
5
6
7
8
tweet_type = case tweet.status
when /\A@\w+/
:mention
when /\Ad\s+\w+/
:direct_message
else
:public
end

CASE - WHEN/THEN

1
2
3
4
5
tweet_type = case tweet.status
when /\A@\w+/ then :mention
when/\Ad\s+\w+/ then :direct_message
else :public
end

這個設定滿方便,用java寫至少要拆成兩個物件才能夠取得return的值。(看不懂不要緊,我沒有說的很清楚,總之就記得ruby這樣的寫法是比較簡潔的即可)。

評論