Ruby基础
字符编码
Ruby中字符串中的编码依赖于其文件的字符编码,可以在文件开头设定文件编码如下:
[Ruby]
#encoding: utf8
# -*- coding: utf-8 -*- # Specify Unicode UTF-8 characters
[/Ruby]
标准输入输出
puts和putc 用来输出
printf用来格式化输出
gets用来读取,但是还要转换成其他的类型的数据
as:number = Integer(gets)
p是puts的简写,但是可以打印出更加有好的信息
Ruby命名规则
Ruby中的命名规则和C语言相同,面向对象的命名则是驼峰法。
全局变量
Ruby中有全局变量,这个和其他语言不同。又因为Ruby是一个纯的面向对象的语言,因此全局变量显然不符合面向对象的风格。但是Ruby的全局变量比其他语言更加随便,因为他不需要在顶层空间中定义,在任何空间中只需要在变量名前面加上$就可以声明一个全局变量,但是在Ruby中完全不建议使用全局变量。
def a_scope
$var = "some value"
end
def another_scope
$var
end
Ruby中通用布尔规则
在ruby中除了nil和false以外,其他的值都是true
命令行参数
ARGV存放了所有的命令行参数
动态语言的作用域规则
for,while,unitle等流程控制结构中,其中声明的变量在流程结构后面还存在,这个跟静态语言的大不相同,但是注意块中变量都是局部的。
并行赋值
@name, @block = name, block
a, b = 1, 2, 3, 4 # a=1, b=2
c, = 1, 2, 3, 4 # c=1
比较操作符
eql?
两个对象的值和类型都必须相等,因此1 == 1.0为true,而1.equ?(1.0)为false
equal?
这是传统的用来比较两个引用的对象是否是同一个,而==则用来比较两个对象是否相等
===
=~
流程控制
for
Ruby中的for语句和Python中的很像。
for i in ['fee', 'fi', 'fo', 'fum']
print i, " "
end
for i in 1..3
print i, " "
end
for i in File.open("ordinal").find_all {|line| line =~ /d$/}
print i.chomp, " "
end
类支持for
只要类实现了each方法就可以支持for语句,yield的参数回传递给for中的迭代变量
class Periods
def each
yield "Classical"
yield "Jazz"
yield "Rock"
end
end
periods = Periods.new
for genre in periods
print genre, " "
end
=》sical Jazz Rock
建议
Ruby中的for语句都是调用对象中的each方法,因此建议不使用for而直接使用额啊传方法来代替。
while
while weight < 100 and num_pallets <= 30
pallet = next_pallet()
weight += pallet.weight
num_pallets += 1
end
until
until和while相反,在开始的时候表达式是true,那么就跳出循环
case
case
when song.name == "Misty"
puts "Not again!"
when song.duration > 120
puts "Too long!"
when Time.now.hour > 21
puts "It's too late"
else
song.play
end
这儿没有匹配,case相当于一个多重if语句
kind = case year
when 1850..1889 then "Blues"
when 1890..1909 then "Ragtime"
when 1910..1929 then "New Orleans Jazz"
when 1930..1939 then "Swing"
when 1940..1950 then "Bebop"
else "Jazz"
end
注意如果不换行,那么必须使用then
类型匹配
case shape
when Square, Rectangle
# ...
when Circle
# ...
when Triangle
# ...
else
# ...
end
if
if count > 10
puts "Try again"
elsif tries == 3
puts "You lose"
else
puts "Enter a number"
end
注意if语句中,最后一个表达式的值是最后的if的结果,因此上面的语句还可以表达成
if count>10
"Try again"
elseif tries == 3
"you lose"
else
"Enter a number"
可以把if语句写到一行上,那么必须在if后面加上then
minimum = if x < y then x else y end
unless
unless==if not
statement modifier
简单来说,就是单行的条件判断
square = square*square while square < 1000
puts "Danger, Will Robinson" if radiation > 3000
打断
1.打断操作符可以用在循环和迭代的块语句中
2.如果和statement modifier合用,那么可以跟简单地表示
break
redo
redo表示把当前的循环再次执行,但是不在计算循环变量,就好像仅仅执行一次一样。
next
then
then在控制结构中是可选的,但是如果判断条件和控制快在一行时必须加上then
三目表达式
cost = duration > 180 ? 0.35 : 0.25
引用测试
o == nil # Is o nil?
o.nil? # Another way to test
Ruby的变量加入规则
在Ruby中,只要在程序中出现了变量的初始赋值,那么这个变量就已经存在于程序中,不论这个赋值是否执行。(这个和传统的想法不同:程序只有在执行赋值时才把变量加入)。
例如下面的赋值:
n = 100 if false
这儿的赋值并没有执行,但是程序空间中已经有这样的一个变量n,这是由于没有赋值,他的值为nil。
注意:
1.对于常量,这个规则有一点不同,因为常量必须有一个初始值,如果向上面的这样,那么常量是一个未初始化状态,引用它会出错
表达式的值
在Ruby中每一个表达式都有一个值,除了While和until没有。
甚至表达式还可以一边返回值,一边抛出异常
if n < 1
raise "argument must be > 0"
elsif n == 1
1
else
n * factorial(n-1)
end
当然,也可以赋值
a = if true then 10 else 20 end