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. 宣告一些变数看看。