Ruby 融合了 Python 和 Perl 的大部分特性,尤其是类似 Perl 的自由,号称比 Python 更面向对象。
本文虽名为基础,这是我在略知 Python 和 Perl 基础上这么认为的。本文最开 始是看 《Programming Ruby 中文版》一书,读第二章的笔记。
命名惯例
- 局部变量、方法参数和方法名称都必须以小写字母或下划线开始。
- 全局变量以 '$' 符号为前缀。
- 实例变量以 '@' 符号为前缀。
- 类变量以 '@@' 符号为前缀。
- 类名称,模块名称和常量必须以一个大写字母开头。
名称可以是字母、数字和下划线的任意组合(但是在@符号后面不能用数字)。按 照惯例,包含多个单词的实例变量名称可以在词与词之间用下划线连接,包含多 个单词的类变量名称可以使用驼峰表示法(每个单词首字母大写)。方法名称可 以是 '?'、'!' 、'=' 字符结尾。
局部变量 || 全局变量 || 实例变量 || 类变量 || 常量和类名 name | $debug | @name | @@total | PI fish_cat | $CUSTOMER| @point_1 | @@sysmtab| FeetPerMile x_axis | $_ | @X | @@N | String thx1138 | $plan9 | @_ | @@x_pos | MyClass _26 | $Global | @plan9 | @@SINGLE | JazzSong
数据结构
数组和散列
数组和散列 (Arrays and Hashes),在解释性语言中都有。
数组
a = [ 1, 'cat', 3.14 ] # 创建数组 a[0] # 访问第一个元素 a[2] = 3.1415926 # 设置第三个元素 a # 整个数组
等同 perl 的 qw 之 %w
可以用 '%w' 创建快速创建数组:
a = [ 'ant', 'bee', 'cat', 'dog', 'elk' ]
a = %w{ant bee cat dog elk}
散列
inst_section = {
'cello' => 'string',
'clarinet' => 'woodwind',
'drum' => 'percussion',
}
inst_section['cello']
控制结构
if
if count > 10 puts "Try again" elsif tries == 3 puts "You lose" else puts "Enter a number" end
while
while weight < 100 and num_pallets <= 30 pallet = next_pallet() weight += pallet.weight num_pallets += 1 end
while line = gets puts line.downcase end
修饰语法
if 和 while
puts "Danger, While Robinson" if radiation > 3000
square = 2 square = square * square while square < 1000
正则
Ruby 的正则和 Perl 一样是内建的。
简单
if line =~ /P(erl|ython)/
puts "Scripting language mentioned: #{line}"
end
替换
line.sub(/Perl/,"Ruby") line.gsub(/Python/,"Ruby") line.gsub(/P(erl|ython)/,"Ruby")
Block 和 迭代器
Block
Block 只是在花括号和 do...end 之间的一组代码:
{ puts "hello"}
do club.enroll(person) person.socialize end
Block 和方法调用
greet { puts "Hi" }
verbose_greet ("Dave", "loyal customer") { puts "Hi" }
Block 和 yeild 组合
def call_block
puts "Start of method"
yield
yield
puts "End of method"
end
call_block { puts "In the block" }
调用示例:
irb#1(main):007:0> call_block { puts "Hi" }
Start the block
Hi
Hi
End the block
yield 的参数
给 yield 提供参数,参数会传递到 block 中。 block 中,竖线 (|) 之间的参 数名接受 yield 的参数。
def call_block
yield ("hello", 99)
end
call_block { |str,num| ... }
迭代器
block 和 yield 组合就是迭代器。迭代器是从某种 collection (如数组)中连 续返回元素的方法:
animals = %w ( ant bee cat dog elk )
animals.each { |animal| puts animal }
Ruby 用迭代实现了很多典型的循环结构:
['cat','dog','horse'].each {|name| print name, " "}
5.times { print "*" }
3.upto(6) {|i| print i}
('a'..'z').each {|char| print char}
读写文件
输入输出
输出
printf ("Number: %5.2f, \nString: %s\n", 1.23, "hello")
输入
line = gets print line
print 的默认参数 $_
Old style:
while gets
if /Ruby/
print
end
end
现在多使用迭代器和预定义的对象ARGF(表示程序的输入文件):
ARGF.each {|line| print line if line =~ /Ruby/}
可以更简:
print ARGF.grep(/Ruby/)
