持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
三、运算符与优先级
在 Ruby 开发(一)中简单了解了以下 Ruby 中的运算符,这次来更全面的总结 Ruby 语言中的运算符。
算数运算符与赋值运算符
Ruby 中的 +、-、*、/、%、** 分别表示 加、减、乘、除、求余、平方,其他语言中的算数符是类似的,其中 ** 需要两个操作数进行运算。
num = 10 ** 3
puts "10 的 3 次方是:" + num.to_s
执行上述代码,输出结果为:
10 的 3 次方是:1000
位运算符
位运算符使用率不够高,进行位运算首先要将十进制的数字转换成为二进制,之后才能按位运算。Ruby 中提供了多种位运算符,包括
&,按位与^,按位异或|,按位或~,按位非<<,按位向左移位>>,按位向右移位 除了~是单目运算符外,其他运算都需要两个操作数进行运算。
以 10|12 的运算为例,在进行位运算前,先转换为二进制,再进行逻辑运算
转换成二进制之后,对每个二进制相同位置上的数进行或运算,如果位置上的数都是 0 则为 0,否则结果为 1,于是最后得出的二进制结果是1111,转换成十进制为14。
异或 ^的运算规则是当位置上的两个数相同时为 0,否则为 1,则10^12的二进制结果为 0110 转换为十进制为 6。
与 & 的运算规则是当两个数都为1时,结果才为 1,否则为0。
左移 >> 和 右移 << n 位,分别指 10 进制的情况下乘以 2 的 n 次方和除以 2 的 n 次方,二进制时左移几位就是后面加几个0,前面去掉几位,右移几位就是在二进制的前面加几位(正数加0,负数加1),后面去掉几位。
~非 就是取相反的值。
比较运算符
Ruby 中包含的比较运算符业余其他语言中的比较运算符类似。
| 比较运算符 | 说明 | 返回值 |
|---|---|---|
| 大于 | true 或 false | |
| < | 小于 | true 或 false |
| >= | 大于等于 | true 或 false |
| <= | 小于等于 | true 或 false |
| == | 等于 | true 或 false |
| != | 不等于 | true 或 false |
| <=> | 比较两个对象 | 1、0 或者 -1 |
| === | 当普通对象位于左边时,功能与 == 相同,如果左边是Range对象,且右边对象包含在该Range对象内,返回true,否则返回false | true 或 false |
| =~ | 正则表达式匹配 | |
| !~ | 正则表达式不匹配 | |
# Ruby 中的比较运算符
puts 1 <=> 2
puts 1 <=> 0
puts 1 <=> 1
上述代码的运行结果如下:
-1
1
0
当左边的对象小于右边的对象时返回 -1,当左边对象大于右边对象时返回 1,左右两边相等时返回 0,对象比较不一定只会返回 true 或者 false。
puts 1 === 1
puts "Stark" === "stark"
puts (1..5) === 3
puts (1..5) === 0
puts (1..5) === 5
puts (1...5) === 5
上述代码的执行结果如下:
true
false
true
false
true
false
当 === 两边是普通对象进行比较时,作用与 == 类似,但是当左变是一个Range对象时,只有当右边的Range对象包含左边时,才会返回 true,否则返回false。
逻辑运算符
Ruby 中包含了以下逻辑运算符:
and:按位与or:按位异或not:按位或&&:逻辑且|:逻辑或!:逻辑非
逻辑运算符常用与布尔表达式或者条件判断中
三目运算符
三目运算符需要三个操作数,第一个操作数为条件,如果条件成立返回一个值,否则返回另外一个值,可以用于简单的条件判断。
name = "tony"
res = name=="stark"?"IronMan":"Not IronMan"
puts res
运行上述代码,输出结果为:
Not IronMan
三目运算符中 ? 后面是条件城市时取得值,如果成立取第一个值,否则取第二个值,两个值使用 : 连接
四、表达式
表达式是由数字、运算符、变量以及括号等组成的组合,在 Ruby 中,常量、变量、各种字面值、相关运算、if while 条件控制语句以及类和方法的定义都可以成为表达式。
并行赋值
Ruby 中除了可以直接给表达式赋值外还可以通过并行赋值和嵌套赋值两种方式进行赋值。在其他语言中想要交换两个变量的值需要通过一个临时变量来存储其中一个变量的值之后再进行交换,在 Ruby 中则无需临时变量,可以使用一行代码搞定。
a, b = 0, 1
puts "交换前:"
puts "a=" + a.to_s, "b="+b.to_s
a, b = b, a
puts "交换后:"
puts "a=" + a.to_s, "b="+b.to_s
执行上述代码,输出内容如下:
交换前:
a=0
b=1
交换后:
a=1
b=0
并行赋值时如果左边时数量多余右边,那边左边多余的变量的值会被设置为空,如果左边的值的数量小于右边,则有右边的值会被忽略。
c, d, e, f = 0, 1
puts "c=" + c.to_s,"d=" + d.to_s, "e=" + e.to_s,"f=" + f.to_s
g, h = 3, 4, 5, 6
puts g, h
i, *j = 7, 8, 9, 10
puts "i=" + i.to_s, "j=" + j.to_s
执行上述代码,输出结果如下:
c=0
d=1
e=
f=
3
4
i=7
j=[8, 9, 10]
当左边的数量小于右边时,并且左边的变量带*,此时会把值集中放在一个数组中,如果没有*多处的值会被舍弃。
嵌套赋值
嵌套赋值就是可以将左边的一些变量用括号括起来,形成一个变量列表,与之对应的右边的值用中括号括起来形成一个子并行赋值的列表。
a, (b, c), d = 0, 1, 2, 3
puts "a=" + a.to_s, "b="+b.to_s, "c="+c.to_s, "d="+d.to_s
运行上述代码,输出如下结果:
a=0
b=1
c=
d=2
可以看出赋值时,(b, c)被当做一个变量并赋值 1,然后 (b, c) = 1 再进行赋值操作,最终得到b=1、c=0,如果上述代码中 c 前面加 *,那么输出结果中c为一个空列表。
a, (b, *c), d = 0, [1, 2, 3], 4, 5
puts "a=" + a.to_s, "b="+b.to_s, "c="+c.to_s, "d="+d.to_s
执行以上代码,输出结果如下:
a=0
b=1
c=[2, 3]
d=4
赋值时[1,2,3]被当成一个整体赋值给同样被当成一个整体的(b, *c), 但是c前面有*,所有c会是一个列表,把多余的值放入列表中
五、流程控制
if 语句
if 判断语句返回的结果是 true 或者false,以此来判断要执行的代码,if 语句的表达式如下:
if 条件1 then
代码块
elsif 条件n
代码块
else
代码块
end
其中 elsif 关键字可以出现 0 次或者多次, else 关键字只可以出现 0 次或者 1 次。
age = 11
if age > 18 then
puts "你已成年"
elsif age < 3
puts "会走路吗?"
elsif age < 10
puts "小学还没毕业"
else
puts "未成年"
end
上述代码会根据 age 所在的范围区间输出不同的结果。