命名惯例
数据结构
数组和散列
控制结构
if
while
修饰语法
正则
简单
替换
Block 和 迭代器
Block
迭代器
读写文件
输入输出

Ruby 融合了 Python 和 Perl 的大部分特性,尤其是类似 Perl 的自由,号称比 Python 更面向对象。

本文虽名为基础,这是我在略知 Python 和 Perl 基础上这么认为的。本文最开 始是看 《Programming Ruby 中文版》一书,读第二章的笔记。

命名惯例

  1. 局部变量、方法参数和方法名称都必须以小写字母或下划线开始。
  2. 全局变量以 '$' 符号为前缀。
  3. 实例变量以 '@' 符号为前缀。
  4. 类变量以 '@@' 符号为前缀。
  5. 类名称,模块名称和常量必须以一个大写字母开头。

名称可以是字母、数字和下划线的任意组合(但是在@符号后面不能用数字)。按 照惯例,包含多个单词的实例变量名称可以在词与词之间用下划线连接,包含多 个单词的类变量名称可以使用驼峰表示法(每个单词首字母大写)。方法名称可 以是 '?'、'!' 、'=' 字符结尾。

局部变量  || 全局变量   || 实例变量   || 类变量    || 常量和类名
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/)