序列的语法是#{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]$