iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 9
0
自我挑戰組

滿滿的紅寶石不拿嗎?-- 去吧!我把世界上的一切都放在那裡了! 系列 第 9

回傳 <> 受傷了就趕快回船上治療! - 滿滿的紅寶石不拿嗎?

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20200917/20128363itoyr3s3Sd.png

[Day09] 別小看喬巴特製研發的藍波球!

今天要介紹的是回傳(return)
在 Ruby 的世界裡,所有的方法執行完後都有回傳值(return value),沒有的話則會回傳一個 nil

回傳的特性是:

回傳 = 交回控制權

  1. 控制權就像令牌一樣,手上有令牌,才能執行程式碼。
  2. 執行完之後,會把控制權再交還給當初呼叫他的人。

單看文字可能有點不好理解,我們來看看實際的例子:

def calc_perimeter(radius)
  return 2 * Math::PI * radius 
  # 執行後把控制權交回給呼叫的程式
end

puts calc_perimeter(5) 

# 印出:
=> 31.41592653589793

在這短短幾行中,程式執行了這幾件事:

  1. 呼叫 calc_perimeter 方法,並傳回 5 作為引數。
  2. 執行 calc_perimeter 方法。
  3. return 交還控制權,並同時回傳計算結果 => 31.41592653589793
  4. 把計算結果交給 puts方法,並印出內容。

在 Ruby 裡,我們也可以省略 return 不寫,方法會自動回傳最後一行的執行結果!

把結果印出來讓我們更了解回傳值!

在學習程式語言的過程中,把結果印出來是相當常見的行為,而要在 Ruby 裡做到這件事,我們會使用:

  • print
  • puts
  • p

以上三者都可以替我們達成印出結果的目標,但是為什麼有三種寫法?有沒有什麼不同呢?先來看看程式實際是如何運作的吧:

print "Ruby"
Ruby => nil 

puts "Ruby"
Ruby
=> nil 

p "Ruby"
"Ruby"
=> "Ruby" 

我們可以發現如果用的是 print 只能印出結果,也不會換行。同時, printputs 回傳的都是 nilnil 代表的意思是沒有回傳值,不過如果是用 p 來印出結果,它還會順便帶一個回傳值回來。

puts "aaa"
aaa
 => nil  # 意思是沒有結果

> p "aaa"
"aaa"
 => "aaa"  #回傳它自己的東西

用簡單的表格來比較三者的差異:

print puts p
不換行 換行 換行
回傳 nil 回傳 nil 回傳帶有型態的值
印出內容 印出內容 印出完整型態的內容

為了更加了解 putsp 的差異,這裡有一組例子:有兩個方法分別為 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 最後也沒有回傳值了!


今天就先到這邊啦!


上一篇
方法 <> 我斑願稱你為最強!站上頂點的方法只有一個 - 滿滿的紅寶石不拿嗎?
下一篇
物件 <> 最初與最盡責的夥伴,黃金梅利號:我想再航行一次! - 滿滿的紅寶石不拿嗎?
系列文
滿滿的紅寶石不拿嗎?-- 去吧!我把世界上的一切都放在那裡了! 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言