[Day09] 別小看喬巴特製研發的藍波球!
今天要介紹的是回傳(return)!
在 Ruby 的世界裡,所有的方法執行完後都有回傳值(return value),沒有的話則會回傳一個 nil
。
回傳的特性是:
回傳
= 交回控制權
單看文字可能有點不好理解,我們來看看實際的例子:
def calc_perimeter(radius)
return 2 * Math::PI * radius
# 執行後把控制權交回給呼叫的程式
end
puts calc_perimeter(5)
# 印出:
=> 31.41592653589793
在這短短幾行中,程式執行了這幾件事:
calc_perimeter
方法,並傳回 5
作為引數。calc_perimeter
方法。return
交還控制權,並同時回傳計算結果 => 31.41592653589793
。puts
方法,並印出內容。在 Ruby 裡,我們也可以省略 return
不寫,方法會自動回傳最後一行的執行結果!
在學習程式語言的過程中,把結果印出來是相當常見的行為,而要在 Ruby 裡做到這件事,我們會使用:
print
puts
p
以上三者都可以替我們達成印出結果的目標,但是為什麼有三種寫法?有沒有什麼不同呢?先來看看程式實際是如何運作的吧:
print "Ruby"
Ruby => nil
puts "Ruby"
Ruby
=> nil
p "Ruby"
"Ruby"
=> "Ruby"
我們可以發現如果用的是 print
只能印出結果,也不會換行。同時, print
和 puts
回傳的都是 nil
,nil
代表的意思是沒有回傳值,不過如果是用 p
來印出結果,它還會順便帶一個回傳值回來。
puts "aaa"
aaa
=> nil # 意思是沒有結果
> p "aaa"
"aaa"
=> "aaa" #回傳它自己的東西
用簡單的表格來比較三者的差異:
puts | p | |
---|---|---|
不換行 | 換行 | 換行 |
回傳 nil |
回傳 nil |
回傳帶有型態的值 |
印出內容 | 印出內容 | 印出完整型態的內容 |
為了更加了解 puts
和 p
的差異,這裡有一組例子:有兩個方法分別為 a
, b
,皆使用 p
印出結果:
def a
p "aaa"
end
def b
p "bbb"
end
a && b
# 印出:
"aaa"
"bbb"
=> "bbb"
不過如果把方法 a
, b
改成用 put
印出結果:
def a
puts "aaa"
end
def b
puts "bbb"
end
a && b
# 印出:
aaa
=> nil
就只會印出 aaa
了。
這是因為 &&
的特性是左右兩側皆為 true
才會成立。
所以當我們用 p
印出結果時,由於 a
, b
兩個方法都有回傳值,因此 a && b
除了會執行方法 a
, b
各自要做的事情 => 印出 "aa"
和 "bb"
。還會有一個的回傳值為 "bb"
(因為 Ruby 會自動回傳最後一個方法的結果)
不過,如果改成用 puts
來印出結果,則會因為方法 a
的回傳值為 nil
而無法執行方法 b
,想當然爾, a && b
最後也沒有回傳值了!
今天就先到這邊啦!