第八章:Ruby 运算符

Ruby 支持一套丰富的运算符。大多数运算符实际上是方法调用。例如,a + b 被解释为 a.+(b),其中指向变量 a 的 + 方法被调用,b 作为方法调用的参数。

对于每个运算符(+ - * / % ** & | ^ << >> && ||),都有一个相对应的缩写赋值运算符(+= -= 等等)。

Ruby 算术运算符

假设变量 a 的值为 10,变量 b 的值为 20,那么:

运算符 描述 实例
+ 加法 - 把运算符两边的操作数相加 a + b 将得到 30
- 减法 - 把左操作数减去右操作数 a - b 将得到 -10
* 乘法 - 把运算符两边的操作数相乘 a * b 将得到 200
/ 除法 - 把左操作数除以右操作数 b / a 将得到 2
% 求模 - 把左操作数除以右操作数,返回余数 b % a 将得到 0
** 指数 - 执行指数计算 a**b 将得到 10 的 20 次方

Ruby 比较运算符

假设变量 a 的值为 10,变量 b 的值为 20,那么:

运算符 描述 实例
== 检查两个操作数的值是否相等,如果相等则条件为真。 (a == b) 不为真。
!= 检查两个操作数的值是否相等,如果不相等则条件为真。 (a != b) 为真。
> 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 (a > b) 不为真。
< 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 (a < b) 为真。
>= 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 (a >= b) 不为真。
<= 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 (a <= b) 为真。
<=> 联合比较运算符。如果第一个操作数等于第二个操作数则返回 0,如果第一个操作数大于第二个操作数则返回 1,如果第一个操作数小于第二个操作数则返回 -1。 (a <=> b) 返回 -1。
=== 用于测试 case 语句的 when 子句内的相等。 (1...10) === 5 返回 true。
.eql? 如果接收器和参数具有相同的类型和相等的值,则返回 true。 1 == 1.0 返回 true,但是 1.eql?(1.0) 返回 false。
equal? 如果接收器和参数具有相同的对象 id,则返回 true。 如果 aObj 是 bObj 的副本,那么 aObj == bObj 返回 true,a.equal?bObj 返回 false,但是 a.equal?aObj 返回 true。
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
 
class Example
   def if_true(num1,num2)
  	   #“==”检查两个操作数的值是否相等,如果相等则条件为真。
	   #puts (num1==num2)
	   #“!=”检查两个操作数的值是否相等,如果不相等则条件为真。
	   #puts (num1!=num2)
	   #“>”检查左操作数的值是否大于右操作数的值,如果是则条件为真。
	   #puts (num1>num2)
	   #“<”检查左操作数的值是否小于右操作数的值,如果是则条件为真。
	   #puts (num1<num2)
	   #“>=”检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。
	   #puts (num1>=num2)
	   #"<="检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。
	   #puts (num1<=num2)
	   #"<=>" 联合比较运算符,
	   # eg: 10 <=> 20 : -1 如果第一个操作数小于第二个操作数则返回 -1
	   # eg: 20 <=> 20 : 0 如果第一个操作数等于第二个操作数则返回 0
	   # eg: 20 <=> 10 : 1 如果第一个操作数大于第二个操作数则返回 1
	   #puts (num1<=>num2)
	   #"===" 用于测试 case 语句的 when 子句内的相等。
	   #puts (1...10) === 11 
	   #".eql?"如果接收器和参数具有相同的类型和相等的值,则返回 true
	   #puts "njh".eql?"njh"
	   #equal?如果接收器和参数具有相同的对象 id,则返回 true。
	   
   end
end
 
# 创建对象
object=Example.new()
object.if_true(10,20)

object1=object
object1.if_true(10,20)

puts object1.equal?object

 

 

Ruby 赋值运算符

假设变量 a 的值为 10,变量 b 的值为 20,那么:

运算符 描述 实例
= 简单的赋值运算符,把右操作数的值赋给左操作数 c = a + b 将把 a + b 的值赋给 c
+= 加且赋值运算符,把右操作数加上左操作数的结果赋值给左操作数 c += a 相当于 c = c + a
-= 减且赋值运算符,把左操作数减去右操作数的结果赋值给左操作数 c -= a 相当于 c = c - a
*= 乘且赋值运算符,把右操作数乘以左操作数的结果赋值给左操作数 c *= a 相当于 c = c * a
/= 除且赋值运算符,把左操作数除以右操作数的结果赋值给左操作数 c /= a 相当于 c = c / a
%= 求模且赋值运算符,求两个操作数的模赋值给左操作数 c %= a 相当于 c = c % a
**= 指数且赋值运算符,执行指数计算,并赋值给左操作数 c **= a 相当于 c = c ** a

 

Ruby 并行赋值

Ruby 也支持变量的并行赋值。这使得多个变量可以通过一行的 Ruby 代码进行初始化。例如:

a = 10 

b = 20 

c = 30

使用并行赋值可以更快地声明:

a, b, c = 10, 20, 30

并行赋值在交换两个变量的值时也很有用:

a, b = b, c

Ruby 逻辑运算符

下表列出了 Ruby 支持的逻辑运算符。

假设变量 a 的值为 10,变量 b 的值为 20,那么:

运算符 描述
and 称为逻辑与运算符。如果两个操作数都为真,则条件为真。
or 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。
&& 称为逻辑与运算符。如果两个操作数都非零,则条件为真。
|| 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。
! 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。
not 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。

 

#!/usr/bin/ruby

num1 = 10;
num2 = 20;
# and  称为逻辑与运算符。如果两个操作数都为真,则条件为真。
puts (num1 > 10 and num2 > 10) 

# or 称为逻辑或运算符。如果两个操作数中有任意一个非假,则条件为真。
puts (num1 > 10 or num2 > 20) 

# && 称为逻辑与运算符。如果两个操作数都非假,则条件为真。
puts (num1 > 0 && num2 > 10) 

# || 称为逻辑或运算符。如果两个操作中有任意一个为真,则条件为真。
puts (num1 > 10 || num2 == 20) 

# !称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。
puts !(num1 > 10 || num2 == 20) 

# not 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。
puts not(num1 > 10 && num2 == 20) 

 

Ruby 三元运算符

有一个以上的操作称为三元运算符。第一个计算表达式的真假值,然后根据这个结果决定执行后边两个语句中的一个。条件运算符的语法如下:

运算符 描述 实例
? : 条件表达式 如果条件为真 ? 则值为 X : 否则值为 Y

 

#!/usr/bin/ruby

num1 = 10;
num2 = 20;
puts (num1 > num2 ? "Y" : "X" )

Ruby 范围运算符

在 Ruby 中,序列范围用于创建一系列连续的值 - 包含起始值、结束值(视情况而定)和它们之间的值。

在 Ruby 中,这些序列是使用 ".." 和 "..." 范围运算符来创建的。两点形式创建的范围包含起始值和结束值,三点形式创建的范围只包含起始值不包含结束值。 

运算符 描述 实例
.. 创建一个从开始点到结束点的范围(包含结束点) 1..10 创建从 1 到 10 的范围
... 创建一个从开始点到结束点的范围(不包含结束点) 1...10 创建从 1 到 9 的范围

 

Ruby defined? 运算符

defined? 是一个特殊的运算符,以方法调用的形式来判断传递的表达式是否已定义。它返回表达式的描述字符串,如果表达式未定义则返回 nil

下面是 defined? 运算符的各种用法:

 

Ruby 点运算符 "." 和双冒号运算符 "::"

你可以通过在方法名称前加上类或模块名称和 . 来调用类或模块中的方法。你可以使用类或模块名称和两个冒号 :: 来引用类或模块中的常量。

:: 是一元运算符,允许在类或模块内定义常量、实例方法和类方法,可以从类或模块外的任何地方进行访问。

请记住:在 Ruby 中,类和方法也可以被当作常量。

你只需要在表达式的常量名前加上 :: 前缀,即可返回适当的类或模块对象。

如果 :: 前的表达式为类或模块名称,则返回该类或模块内对应的常量值;如果 :: 前未没有前缀表达式,则返回主Object类中对应的常量值。 

Ruby 运算符的优先级

下表按照运算符的优先级从高到低列出了所有的运算符。

方法 运算符 描述
:: 常量解析运算符
[ ] [ ]= 元素引用、元素集合
** 指数
! ~ + - 非、补、一元加、一元减(最后两个的方法名为 +@ 和 -@)
* / % 乘法、除法、求模
+ - 加法和减法
>> << 位右移、位左移
& 位与
^ | 位异或、位或
<= < > >= 比较运算符
<=> == === != =~ !~ 相等和模式匹配运算符(!= 和 !~ 不能被定义为方法)
  && 逻辑与
  || 逻辑或
  .. ... 范围(包含、不包含)
  ? : 三元 if-then-else
  = %= { /= -= += |= &= >>= <<= *= &&= ||= **= 赋值
  defined? 检查指定符号是否已定义
  not 逻辑否定
  or and 逻辑组成

注意:在方法列标识为  的运算符实际上是方法,因此可以被重载。

 

发布了76 篇原创文章 · 获赞 15 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章