这是一份简短的指南,帮助您阅读我网站上的 Ruby 代码示例。这不是一份完整的 Ruby 指南,我只涵盖了我在文章中使用的结构。我假设您熟悉基本的 OO 语言。

左侧列包含代码片段,右侧是对这些片段组的解释。如果您发现一些您不理解的 Ruby 代码,请向下滚动左侧查看类似的代码。

对于 Ruby 入门,最好的书籍是 PickAxe。对于在线指南,没有比 Why's (poignant) Guide 更好的了。

puts "hello world"

打印到控制台

字符串可以使用单引号或双引号(具有不同的转义规则)。

class ClassName

声明一个类

def some_method arg1, arg2
  call_method(arg1)
end

def property= arg1
  @property = arg1
end

声明一个方法

该方法可以是全局的(如果在顶层定义)或类上的实例方法。

在方法定义和方法调用中,括号是可选的,只要没有歧义。

方法名称可以包含“=”(在这种情况下,它们用作 name = aValue。名称可以包含“?”,通常用于布尔 getter(例如 aSet.include?(aValue))。

@field

实例变量。

不需要声明,它在第一次使用时定义。如果在设置之前访问,它将返回 nil。

def self.class_method

定义一个类方法

@@class_variable

类变量

$global_variable

全局变量

attr_accessor :field1, :field2
attr_reader :field

带有访问器的实例变量

使用运行时代码生成来定义 getter name 和 setter name = argattr_accessor 定义两者,attr_reader 只定义 getter。

def initialize

初始化方法

每当您创建实例时,都会调用此方法。默认情况下,您使用 aClass.new(arg1, arg2) 创建一个对象。这两个参数都传递给 initialize,因此您为每个需要的参数声明一个参数。您也可以定义其他类方法,这些方法使用其他名称创建新实例。

class Subclass < Superclass

声明继承

{|arg1, arg2| doSomething(arg1, arg2)}

do |arg1, arg2| 
  doSomething(arg1, arg2)
end

do
  doSomething
end

定义一个块,Ruby 对 闭包 的称呼。两种语法 {} 和 do/end 基本上是等效的。{} 形式通常用于单行代码,而 do/end 形式用于多行代码块。

可以接受零个或多个参数。像任何闭包一样,可以引用词法范围内的任何变量。

块在 Ruby 的库中被广泛使用。

var ||= value

如果为 nil 则赋值

仅当 var 为 nil 时,才将值赋给 var。它等效于 var = value if nil == var

这里令人头疼的细节来自于 nil 是假值(这意味着 nil 在布尔表达式中被视为 false)。因此,类似于 var += 5 这样的表达式,这个表达式等效于 var = var || value

aList.each {|i| doSomething(i)}

循环遍历列表

一个 是循环遍历列表的常用方法。列表上的其他操作是使用 CollectionClosureMethod 完成的。

emptyArray = []
newArray = [var, "some text"]
doSomething([var1, var2])

数组

Ruby 的数组实际上是列表。它们是可增长的结构,具有丰富的 API。您可以在表达式中的任何地方自由使用它们,例如在方法调用中。

var = aHash[key]
aHash[key] = var
newHash = {key1 => value1, key2 => value2}
emptyHash = {}

哈希

anObject.
  aMethod(arg1,
    arg2,
    arg3)

推断语句延续

Ruby 使用换行符作为语句分隔符。96% 的情况下,这正是您需要的。但是,有时行会变得太长,因此使用换行符的语言需要一个语句延续字符来允许语句跨行。

Ruby 使用几个字符来推断语句延续。因此,如果您在参数列表中以“,”结束一行,Ruby 会推断您想要继续该语句。类似地,如果您以“.” 结束一行以进行方法调用。