BOO入門 > 變數 (上一章:開始 下一章:流程控制/條件)


把 Booish 當成計算機

编辑

有五個基本的數字運算子:加 +、減 -、乘 *、除 /、取餘數 %,就先用這幾個運算子來試試吧。

$ booish
>>> 2 + 4 // 兩個 '/' 之後表示註解
6
>>> 2 * 4 # 在 '#' 之後也是註解
8
>>> 4 / 2 /* 這也是一個註解 */
2
>>> (500/10)*2
100
>>> 7 / 3 // 數值相除
2
>>> 7 % 3 // 取餘數
1
>>> -7 / 3
-2

你應該注意到上面包含了三種註解的方式: //、# 和 /* */。他們對程式沒有影響,不過在你寫程式時卻是很有用的幫手。

  建議 當使用單行註解時,盡量使用 // 而不要使用 #。

或許你還注意到 7/3 並不是得到 2.333....,這是因為你拿兩個整數相除。

  定義 整數:任何不包含小數位的正負數字,包括 0 都是所謂的整數。

電腦處理整數相除時,會作四捨五入去掉小數。 因此有小數位的話,你必須使用浮點數。

  定義 浮點數:在數學裡通常指的就是"有理"數,也就是有小數的數字。
$ booish
>>> 7.0 / 3.0 // Floating point division
2.33333333333333
>>> -8.0 / 5.0
-1.6

如果你的數字有小數點,即使它是 .0,它仍然是浮點數。

數字的型別

编辑

浮點數的種類有三種:單精度(single)、双精度(double)與 decimal。

單精度與双精的不同在於可表達數字的大小。在大部分的情況下,會比較偏好使用双精。

這兩者是以二進制為基底,在十進制數字系統運作時會導致一些問題發生。通常是沒什麼關係,但是在某些特定情況,像銀行,是不允許在數十兆的金錢合約中遺失一、兩分錢的。

這是 Decimal 被建立的原因。它是十進制的數字,這意味著不會遺失掉寶貴的一分錢。在正常的情形,倍經度非常完美。但在要求高精準的情況下,應該要使用 decimal。

之前我們提到的整數,其實也有多種的型別。"unsigned" 表示不允許存放負數﹔大小也有所不同:byte、short、int 和 long。 大部分的情況下,預設是使用 int。

字元與字串

编辑
  定義 字元:用來表示語言的可書寫符號。

所有在字母表的字母是字元,所有數字是字元,所有漢語字是字元,所有數學符號也是字元。在 Boo/.NET 裡面,字元都是以 Unicode 來編碼。

  定義 字串:線性連續的多個字元。

"apple" 就是宣告一個字串。

$ booish
>>> s = "apple"
'apple'
>>> print s
apple
>>> s += " banana"
'apple banana'
>>> print s
apple banana
>>> c = char('C')
C
>>> print c
C

看完例子,你可能不太想用字元,而改使用字串了。宣告字串的方式有三種:

  1. 使用雙引號,像是 "apple"
  2. 使用單引號,像是 'apple'
  3. 使用三個雙引號 """apple"""

前兩者的範圍都只有在單行,但三個雙引號可以跨越多行﹔此外,前兩者可以包含 '\'(反斜線逸出字元),第三者則將所有字元如實表示出來。

$ booish
>>> print "apple\nbanana"
apple
banana
>>> print 'good\ttimes'
good      times
>>> print """Leeroy\Jenkins"""
Leeroy\Jenkins

一般常見逸出字元有:

  • \\ 倒斜線(譯注:原文為 literal backslash,我懷疑這邊有問題)
  • \n 換行
  • \r 回行首
  • \t tab

如果你宣告了雙引號的字串,而你在字串裡又想使用雙引號的話,你可以使用 '\'(反斜線),同樣地,單引號字串也可以這樣使用。

$ booish
>>> print "The man said \"Hello\""
The man said "Hello"
>>> print 'I\'m happy'
I'm happy

字串是不變的,這意味著字串裡面的字元永遠不會被改變,你必須重新建立字串以改變其中的一個字元。(譯注:這是指內部處理而言,實際上當你重複指定,如: s="10" s="20",內部實際上是建立了 "10" 這個物件,然後將 s 指向 "10",接著再建立 "20" 這個物件,再把 s 指向 "20"。就是因為這樣,作者才會說字串裡面的字元永遠不會被改變。)

  定義 不變性:在字串建立以後並不是無法改變,只是試著改變一個不可變的物件時,會有錯誤發生。不變的相反是可變的。

字串的插值

编辑

字串插值讓你可以插入任何合法的 boo 運算式的值到字串裡面,使用方法是在運算式前後加上 ${}。

$ booish
>>> name = "Santa Claus"
Santa Claus
>>> print "Hello, ${name}!"
Hello, Santa Claus!
>>> print "2 + 2 = ${2 + 2}"
2 + 2 = 4

建議使用字串插值來取代字串相加的方式,原因是這比較簡單而且直覺。

字串插值會作用在使用雙引號的字串(含三引號的字串),但不作用在單引號的字串。

str = "Hello world!"
str_single_quote = '${str}'
str_double_quote = "${str}"
str_triple_quote = """${str}"""

print str_single_quote
print str_double_quote
print str_triple_quote

# 結果:
# ${str}
# Hello world!
# Hello world!

不想讓字串插值作用的話,在 $ 前面加上溢出字元 '\' 即,例如:\${}

布林

编辑
  定義 布林:表示 true (真) 或 false(假)的型別。

布林(Boolean)數值只能是 true(真) 或 false(假),在下個章節提到的條件式裡會經常被用到。

$ booish
>>> b = true
true
>>> print b
True
>>> b = false
false
>>> print b
False

对象型別

编辑
  定義 对象(物件):在物件導向程式設計程式典範中的中心觀念。

在 Boo/.NET 裡面,任何東西都是对象。即使像數字、字元這些值型別,也都是对象。

$ booish
>>> o as object
>>> o = 'string'
'string'
>>> print o
string
>>> o = 42
42
>>> print o
42

对象的問題是,你無法期望他是一個字串或是一個整數。看看下面的例子,如果不宣告 o as object 的話,這樣的順序是會出錯的:(譯注:Boo 會自動預測你所使用的型別,由於第一次被指定為字串,所以之後 o 就都被認定為字串了,接著再指派給它一個整數,Boo 會認定為錯誤,如果你修改為 o as object = "string" ,那麼就不會出錯,但是就無法得知 o 是一個字串或是一個整數了。)

$ booish
>>> o = 'string'
'string'
>>> print o
string
>>> o = 42
--------^
ERROR: Cannot convert 'System.Int32' to 'System.String'.

靜態型別可以讓程式碼更為安全與可靠。

宣告型別

编辑

這一章的最後,你會學到如何宣告變數的型別,也就是 o as object,<變數> as <型別> 的語法在任何型別上都適用,<型別>可以是 int、string、DateTime、bool 或是任何你自己定義的類別。

大部分的情況,Boo 都能聰明地知道你要的是什麼型別,i=25 就等同於 i as int = 25。

  建議 除非你之前已經宣告了同名的變數並且想變更型態,否則不要明確的指明變數要使用什麼型別。也就是盡量使用 i=25 來替代 i as int=25

值型別列表

编辑
Boo 型別 .NET Framework 型別 可表示正負? 長度(bytes) 數值範圍
sbyte System.Sbyte 1 -128 ~ 127
short System.Int16 2 -32768 ~ 32767
int System.Int32 4 -2147483648 ~ 2147483647
long System.Int64 8 -9223372036854775808 ~ 9223372036854775807
byte System.Byte 1 0 ~ 255
ushort System.Uint16 2 0 ~ 65535
uint System.UInt32 4 0 ~ 4294967295
ulong System.Uint64 8 0 ~ 18446744073709551615
single System.Single 4 接近 ±1.5 x 10-45 - ±3.4 x 1038 到七個有效位數
double System.Double 8 接近 ±5.0 x 10-324 - ±1.7 x 10308 到 15 或 16 個有效位數
decimal System.Decimal 12 接近±1.0 x 10-28 - ±7.9 x 1028 到 28 或 29 個有效位數
char System.Char N/A 2 Any UTF-16 character
bool System.Boolean N/A 1 true 或 false
  建議 永遠都不要使用 .Net Framework 型別,使用內建型別。

練習

编辑
  1. 宣告一些變數看看。