【Ruby学习笔记】2:基本运算符

序列

序列的语法是#{Ruby表达式}

序列可以替换任意Ruby表达式的值给一个字符串,非常方便:

#!/usr/bin/ruby
name=gets().chomp()
age=21
puts("#{name},出生年份是#{2018-age}")
[lzh@hostlzh Ruby]$ ruby 1.rb
LZH
LZH,出生年份是1997
[lzh@hostlzh Ruby]$

运算符

算数运算符

算数运算符还是那6个,加/减/乘/除/求模/指数,不过Ruby实在太OOP了,运算符原来也是对象的方法调用!

#!/usr/bin/ruby
a=7
b=2.5
puts(a+b)
puts(a.+(b))
puts(a**b)
puts(a.**(b))

也就是说,a+b其实是a.+(b),是对a这个对象,调用其+()方法,把b传进来作为参数,返回结果。这时候方法的拥有对象称为接收器,右边传入的对象称为参数

[lzh@hostlzh Ruby]$ ruby 1.rb
9.5
9.5
129.641814242165
129.641814242165
[lzh@hostlzh Ruby]$

比较运算符

比较运算符也是,如:

#!/usr/bin/ruby
a=7
b=2.5
puts(a==b)
puts(a.==(b))
puts(a!=b)
puts(!a.==(b))
[lzh@hostlzh Ruby]$ ruby 1.rb
false
false
true
true
[lzh@hostlzh Ruby]$

除了常规的那些之外,Ruby里还有一些特殊的比较运算符。


<=>联合比较运算符,当左边大时返回1,相等时返回0,左边小时返回-1:

#!/usr/bin/ruby
a=7
b=2.5
c=7
puts(a<=>b)
puts(a<=>c)
puts(b<=>a)
puts(b.<=>(c))
[lzh@hostlzh Ruby]$ ruby 1.rb
1
0
-1
-1
[lzh@hostlzh Ruby]$

.eql?()可用来比较两个对象是不是值和类型都相同:

#!/usr/bin/ruby
a=7
b=2.5
c=7.0
puts(a==c)
puts(a.eql?(c))
[lzh@hostlzh Ruby]$ ruby 1.rb
true
false
[lzh@hostlzh Ruby]$

.eql?()用来比较两个对象是不是同一个对象,也就是是否有同一个object_id值:

#!/usr/bin/ruby
a=d=7
c=7
puts("a和c是同一个对象吗?#{a.equal?(c)}")
puts("a和d是同一个对象吗?#{a.equal?(d)}")
puts("a=#{a},id=#{a.object_id}")
puts("d=#{d},id=#{d.object_id}")
puts("执行了a=#{a=3}")
puts("现在a和d是同一个对象吗?#{a.equal?(d)}")
puts("a=#{a},id=#{a.object_id}")
puts("d=#{d},id=#{d.object_id}")
puts
e=f="LZH"
puts("e和f是同一个对象吗?#{e.equal?(f)}")
puts("e=#{e},id=#{e.object_id}")
puts("f=#{f},id=#{f.object_id}")
puts("执行了e=\"#{e="SB"}\"")
puts("现在e和f是同一个对象吗?#{e.equal?(f)}")
puts("e=#{e},id=#{e.object_id}")
puts("f=#{f},id=#{f.object_id}")
[lzh@hostlzh Ruby]$ ruby 1.rb
a和c是同一个对象吗?true
a和d是同一个对象吗?true
a=7,id=15
d=7,id=15
执行了a=3
现在a和d是同一个对象吗?false
a=3,id=7
d=7,id=15

e和f是同一个对象吗?true
e=LZH,id=-608668668
f=LZH,id=-608668668
执行了e="SB"
现在e和f是同一个对象吗?false
e=SB,id=-608668748
f=LZH,id=-608668668
[lzh@hostlzh Ruby]$

可见赋值以后,会把对象分开来,不会改变其它使用该对象的变量。


===的比较操作会用到其它知识,后面再学。

赋值运算符

除了基本的赋值运算符之外,Ruby也支持并行赋值

#!/usr/bin/ruby
a,b,c=3,"SB",6.0
print(a," ",b," ",c,"\n")
a,b,c=c,a,b
puts(a,b,c)
[lzh@hostlzh Ruby]$ ruby 2.rb
3 SB 6.0
6.0
3
SB
[lzh@hostlzh Ruby]$

这个例子也说明了puts()用逗号隔开的都会换行一次。

位运算符

用的很少,还是那些:

#!/usr/bin/ruby
a=0b10010101
b=0b01011001
puts("a=#{a},b=#{b}")
puts("a&b=#{a&b}")
puts("a|b=#{a|b}")
puts("a^b=#{a^b}") #异或
puts("~a=#{~a}")
puts("a<<2=#{a<<2}") #左移
puts("a>>2=#{a>>2}") #右移
[lzh@hostlzh Ruby]$ ruby 2.rb
a=149,b=89
a&b=17
a|b=221
a^b=204
~a=-150
a<<2=596
a>>2=37
[lzh@hostlzh Ruby]$

逻辑运算符

#!/usr/bin/rubya
a=10
b=20
if a+10==b and a+b>40
    puts("and")
elsif a+11==b or a+b<40
    puts("or")
elsif a+10==b && b%2==0
    puts("&&")
elsif a<100 || b>100
    puts("||")
elsif not(a==b)
    puts("not")
end
[lzh@hostlzh Ruby]$ ruby 3.rb 
or
[lzh@hostlzh Ruby]$

三目运算符

在python里没有这个,只能用xxx if xxx else xxx,在Ruby里又和C/C++一样了。

#!/usr/bin/rubya
a=10
b=20
c=a+b<20 ? b-a : b*a
puts(c)
[lzh@hostlzh Ruby]$ ruby 3.rb 
200
[lzh@hostlzh Ruby]$

你可能感兴趣的:(Ruby)