iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
0
自我挑戰組

Ruby名詞解釋總匯系列 第 5

Day 5 : Ruby中的「數字、符號」

https://ithelp.ithome.com.tw/upload/images/20200912/20129424kGV2BMklLi.jpg

數字:整數 Integer、浮點數 Float

*英文發音
首先來聽聽英文發音~。

整數 Integer
Yes

浮點數 Float
Yes

名詞解釋

數字型別包含:

  • 整數 Integer:可數的,EX:1,2,3,4,5......。
  • 浮點數 Float:小數點,EX:3.33。

Ruby世界的數字?

因為Ruby是物件導向的程式語言,大多數看到的皆是「物件」,肉眼看起來像數字外觀的數字也是物件的一種唷。

△肉眼觀世間,曖昧難辨

puts 1 + 2
印出來 -> 3

以上看起來簡簡單單的加法運算,但其實加號在Ruby中只是一般的方法(method),省略了小括號。

原來的樣子應該是如下:

puts 1.+(2)
印出來 -> 3

這個加號,事實上是「數字物件 1」呼叫了「+」這個方法,並且把「數字物件 2」當做參數傳進去。也因為他是一個方法,所以也可以重新改寫它原來的功能,讓 1 + 1 不等於 2 都是有可能的。

浮點數轉整數

puts 3.33.round #轉成整數,四捨五入
puts 3.33.floor #轉成整數,無條件捨去
puts 3.33.ceil  #轉成整數,無條件進位
puts 3.33.to_i  #小數轉整數,無條件捨去

型別轉換 Conversions

字串可以使用以下轉型方法:

to_i: 轉整數
to_f: 轉浮點數
to_sym: 轉符號
to_s: 轉字串

如下範例:

p "169.99cm".to_f   # 169.99
p "169.99cm".to_i   # 169
p "169.99cm".to_sym # :"169.99cm"
p :169cm.to_s       # "169cm"

整數除法

因為Ruby是物件導向程式語言,看過去的東西大多為物件,因此在Ruby世界裡面,整數除以整數會得到整數10/3 == 3

*那要如何得到小數點?

除數或被除數其中一個改小數點即可!

10.0/3 == 3.333333
10/3.0 == 3.333333
10.0/3.0 == 3.333333

符號 Symbol

*英文發音
首先來聽聽英文發音~。
https://youtu.be/EJg47hnavNM

名詞解釋

在了解符號之前,先來加深「物件」的概念。在Ruby的世界裡,看到的大多是物件,如以下:

  • 1000:數字物件
  • "World peace":字串物件
  • :vegan:符號物件

由以上可以得知,「符號 Symbol」使用冒號:開頭,他類似一種無法修改的字串,我們會說他是「有名字的物件 an object with a name」。

要注意的是,「符號」不是「變數」,是值,本身不會只向任何東西。

# 「變數」可以指向
say = "hello world!"

# 「符號」不可以指向
:say = "hello world!" -> 會出錯!

*那字串跟符號哪裡不一樣?
字串的效能會比符號差了一點點,兩者最主要的差異在於「記憶體的管理方式」,由於 Ruby中的每個字串都是新的物件,所以即使是相同的字串也會佔用不同的記憶體,而符號則是重復利用:

puts "string".object_id # 2157007700 <- 不同記憶體位置
puts "string".object_id # 2157007540
puts :symbol.object_id  # 391528 <- 相同的記憶體位置
puts :symbol.object_id  # 391528

*不可變(immutable)的特性?
符號具有不可變的特性,字串可以改變值,符號不行。
可由以下例子得知:

name = "abcde"
name[3] = 4
p name -> "abc4e"

name = :abcde
name[3] = 4
p name -> undefined method `[]=' for :abcde:Symbol (NoMethodError)

*符號的功用是什麼呢?
因為以上的特性,讓符號在Ruby中主要用作hash的鍵(key)或者是用來指稱方法的名稱。

hash = {:key => "12345", :symbol => "string"}

總整理

  1. immutable:被建立後就不能改變。
  2. 任何「符號」都指稱到同一個記憶體位置,因此較省記憶體。
  3. 以「符號」當作鍵(key)的效能會比「字串」當作鍵的效能來得好。

回家作業

請回答以下問題:

1.請問符號是什麼?跟變數一樣嗎?
2.字串嵌入 String interpolation是什麼?如何實作?
3.請寫出以下p後會印出什麼?
  p 3.30393.floor
  p 1.33.to_i
  p :hello.to_s
  

參考資料


上一篇
Day 4 : Ruby中的「資料型別、字串」
下一篇
Day 6 : Ruby中的「陣列、範圍」
系列文
Ruby名詞解釋總匯14
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言