Ruby 支持不少操做符。大多数操做符是方法调用。例如a+b 解释为a+(b), 此处+方法是以b为参数的变量引用的对象的方法。算法
每一个操做符(+ - * / % ** & | ^ << >> && ||), t对应的有简短的赋值符 (+= -=等).测试
Operator | Description | Example |
---|---|---|
+ | Addition − 加法 | a + b 结果 30 |
− | Subtraction −减法 | a - b 结果 -10 |
* | Multiplication −乘法 | a * b 结果 200 |
/ | Division −除法 | b / a 结果 2 |
% | Modulus − 求模,除法求余数 . | b % a 结果 0 |
** | 指数算法,次幂 | a**b 结果 10的20次方 |
假设a=10,b=20, this
Operator | 描述(注意,若是操做符不是逻辑运算数,则返回数值,非零等同于true) | 举例 |
---|---|---|
== | 相等 | (a == b) 结果 false. |
!= | 不等 | (a != b) 结果 true. |
> | 大于 | (a > b) 结果 not true. |
< | 小于 | (a < b) 结果 true. |
>= | 大于等于 | (a >= b) 结果 not true |
<= | 小于等于 | (a < b) 结果 true. |
<=> | 左边大返回1,相等返回0,右边大返回-1 | (a <=> b) 结果 -1. |
=== | case 语句中使用,测试相等 | ( (1...10) === 5 结果 true. |
.eql? | 类型和数值相等; | 1 == 1.0 结果 true, but 1.eql?(1.0) 结果 false. |
equal? | 对象Id相等,至关于指针比较。不能被覆盖。 | c=a; a==c 结果 true, a.equal?b 结果 false a.equal?c 结果 true |
尝试如下代码,深刻理解指针
class Object def all_equals(o) ops = [:==, :===, :eql?, :equal?] Hash[ops.map(&:to_s).zip(ops.map {|s| send(s, o) })] end end "a".all_equals "a" # => {"=="=>true, "==="=>true, "eql?"=>true, "equal?"=>false}
假设a=10,b=20, code
Operator | Description | Example |
---|---|---|
= | 简单赋值 | c = a + b |
+= | 加和赋值 | 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 |
和Python 相似,如下语句
a = 10
b = 20
c = 30
能够用下面的并行赋值方法:对象
a, b, c = 10, 20, 30
并行赋值,也能够用于数据交换:ip
a, b = b, c字符串
位操做符,按位操做。it
假设 a = 60; b = 13;io
a = 0011 1100
b = 0000 1101
------------------
a&b = 0000 1100
a|b = 0011 1101
a^b = 0011 0001
~a = 1100 0011
Operator | Description | Example |
---|---|---|
& | 二进制 AND | (a & b) 结果 12,二进制 0000 1100 |
| | 二进制 OR | (a | b) 结果 61, 二进制 0011 1101 |
^ | 二进制 XOR | (a ^ b) 结果 49, 二进制 0011 0001 |
~ | 二进制补位 | (~a ) 结果 -61, 二进制 1100 0011 由于有符号位 |
<< | 二进制左移 | a << 2 结果 240, 二进制 1111 0000 |
>> | 二进制右移 | a >> 2结果 15, 二进制 0000 1111 |
假设a=10; b=20;
Operator | 描述(当数值参与运算,返回值,用于逻辑判断时,非零等同于true, 0等同于false) | 举例 |
---|---|---|
and | 逻辑 and | (a and b) 等同于 true. |
or | 逻辑 or | (a or b) 等同于 true. |
not | 逻辑 NOT | not(a && b) 等同于false. |
&& | 逻辑 && . | (a && b) 等同于 true. |
|| | 逻辑 OR | (a || b) 等同于 true. |
! | 逻辑 NOT | !(a && b) 等同于false. |
格式:
condition? X : Y
和其它语言相似。条件成立则X,不然Y。
使用 ".." 和 "..." 来定义范围。俩点操做符包含俩端,三点不包括高端值。
(1..10) 包括从1到10
(1...10)包括1到 9.
defined? 是一个特殊操做符,来检查后面的表达式是否已经定义。若是已经定义,则返回表达式的字符串,不然返回nil.
例如:
foo = 42
defined? foo # => "local-variable"
defined? $_ # => "global-variable"
defined? bar # => nil (undefined)
调用模块方法用点(.)操做符,引用常量使用双冒号(::)
若是没有前缀,默认是主模块。
MR_COUNT = 0 # constant defined on main Object class
module Foo
MR_COUNT = 0
::MR_COUNT = 1 # set global count to 1
MR_COUNT = 2 # set local count to 2
end
puts MR_COUNT # this is the global constant
puts Foo::MR_COUNT # this is the local "Foo" constant
优先级从高到低以下:
ethod | Operator | Description |
---|---|---|
Yes | :: | 常量解析符 |
Yes | [ ] [ ]= | 元素引用,元素集合 |
Yes | ** | 指数(次方) |
Yes | ! ~ + - | Not(非), 补位,加,减(这儿加减是单操做符,+@,-@)。 |
Yes | * / % | 乘,除,求余。 |
Yes | + - | 加,减 |
Yes | >> << | 右位移,左位移 |
Yes | & | 位 'AND |
Yes | ^ | | 位 XOR, 正常的OR |
Yes | <= < > >= | 比较操做符 |
Yes | <=> == === != =~ !~ | 相等和模式匹配操做符(~=和 !~ 不能定义方法)。 |
&& | 逻辑 AND | |
|| | 逻辑 OR | |
.. ... | 范围(包括,不包括) | |
? : | 三元操做符,等价于 if-then-else | |
= %= { /= -= += |= &= >>= <<= *= &&= ||= **= | 赋值 | |
defined? | 检查是否认义 | |
not | 逻辑非 | |
or and | 逻辑 or and |
注意:operators 栏目为yes, 说明实际是方法,能够被覆盖。
后记,由于今天我写长草稿,没有保存住,因此后面写的,会写多少,发布多少。