跳转至内容

Ruby 编程/概述

来自 Wikibooks,开放世界的开放书籍

| 安装 Ruby →


Ruby 是一种最初由松本行弘(也称为 Matz)开发的面向对象脚本语言。Ruby 编程语言的主网站是ruby-lang.org。开发始于1993年2月,Ruby 的第一个 alpha 版本于1994年12月发布。它被开发为PerlPython等脚本语言的替代方案。[1] Ruby 大量借鉴了 Perl,并且类库本质上是 Perl 功能的面向对象重组。Ruby 还借鉴了LispSmalltalk。虽然 Ruby 没有借鉴 Python 的许多特性,但阅读 Python 的代码帮助 Matz 开发了 Ruby。[1]

MacOS 已经预装了 Ruby。大多数Linux发行版要么预装了 Ruby,要么允许您轻松地从发行版的自由软件存储库中安装 Ruby。您还可以在Windows上下载并安装 Ruby。技术能力更强的用户可以下载 Ruby 源代码[2],并将其编译到大多数操作系统,包括UnixDOSBeOSOS/2、Windows 和 Linux。[3]

Ruby 结合了 Perl、Smalltalk、EiffelAda、Lisp 和 Python 的特性。[3]

面向对象

[编辑 | 编辑源代码]

Ruby 竭尽全力成为一种纯粹的面向对象语言。Ruby 中的每个值都是一个对象,即使是最原始的东西:字符串、数字,甚至truefalse。每个对象都有一个,每个类都有一个超类。在类层次结构的根部是类BasicObject,所有其他类(包括Object)都继承自它。

每个类都有一组方法,这些方法可以在该类的对象上调用。方法总是对对象进行调用——没有“类方法”,就像许多其他语言中那样(尽管 Ruby 在模拟它们方面做得很好)。[需要引用来源]

每个对象都有一组实例变量,用于保存对象的状态。实例变量是在对象上调用的方法内部创建和访问的。实例变量对对象完全私有。其他任何对象都无法看到它们,即使是同一类的其他对象或类本身也无法看到。Ruby 对象之间所有通信都通过方法进行。

除了类之外,Ruby 还有模块。模块具有方法,就像类一样,但它没有实例。相反,模块可以被包含或“混合”到类中,这会将该模块的方法添加到类中。这非常类似于继承,但更灵活,因为一个类可以包含许多不同的模块。通过将各个功能构建到单独的模块中,可以以复杂的方式组合功能并轻松重用代码。Mixin 有助于使 Ruby 代码免于复杂且限制性的类层次结构。

Ruby 是一种非常动态的编程语言。Ruby 程序不会像 C 或 Java 程序那样进行编译。程序中所有类、模块和方法的定义都在运行时由代码构建。程序还可以修改其自身的定义,即使在运行时。甚至像 String 和 Integer 这样的语言中最原始的类也可以被打开和扩展。Ruby 开发人员称之为猴子补丁,这是大多数其他语言中无法做到的。

Ruby 中的变量是动态类型的,这意味着任何变量都可以保存任何类型的对象。当您对对象调用方法时,Ruby 仅根据名称查找方法——它不关心对象的类型。这称为鸭子类型,它允许您创建可以假装成其他类的类,只需实现相同的方法即可。

单例类

[编辑 | 编辑源代码]

当我说每个 Ruby 对象都有一个类时,我撒了谎。事实是,每个对象都有两个类:“常规”类和单例类。对象的单例类是一个无名类,其唯一的实例是该对象。每个对象都有其自己的单例类,并在创建对象的同时自动创建。单例类继承自其对象的常规类,并且最初为空,但您可以打开它们并向其中添加方法,然后可以在属于它们的单个对象上调用这些方法。这是 Ruby 避免“类方法”并保持其类型系统简单优雅的秘密技巧。

元编程

[编辑 | 编辑源代码]

Ruby 是如此面向对象,以至于类、模块和方法本身也是对象!每个类都是类Class的实例,每个模块都是类Module的实例。您可以在运行程序时调用其方法来了解它们,甚至修改它们。这意味着您可以使用 Ruby 代码生成类和模块,这种技术称为元编程。明智地使用元编程允许您在代码中捕获高度抽象的设计模式,并像调用方法一样轻松地实现它们。

灵活性

[编辑 | 编辑源代码]

在 Ruby 中,一切都是可变的。可以向现有类添加方法,无需子类化;可以对运算符进行重载;甚至可以在运行时重新定义标准库的行为。

变量和作用域

[编辑 | 编辑源代码]

在 Ruby 中,您不需要声明变量或变量作用域。变量的名称自动决定其作用域。

  • x是局部变量(或变量以外的其他东西)。
  • $x是全局变量。
  • @x是实例变量。
  • @@x是类变量。

代码块

[编辑 | 编辑源代码]

代码块是 Ruby 最独特、最受喜爱的特性之一。代码块是一段代码,可以出现在方法调用之后,如下所示

laundry_list.sort do |a,b|
  a.color <=> b.color
end

代码块位于doend之间。代码块中的代码不会立即执行,而是打包成一个对象并作为参数传递给sort方法。该对象可以随时调用,就像调用方法一样。该sort方法在需要比较列表中的两个值时都会调用代码块。代码块使您可以很好地控制sort的行为。代码块对象(与任何其他对象一样)可以存储在变量中、传递给其他方法,甚至可以复制。

许多编程语言都支持这样的代码对象。它们被称为闭包,是任何语言中都非常强大的特性,但通常未被充分利用,因为创建它们的代码往往看起来很丑陋且不自然。Ruby 代码块只是创建闭包并将其传递给方法的常见情况的一种特殊且简洁的语法。这一简单的特性启发了 Ruby 开发人员广泛使用闭包,并以各种创造性的新方式使用它们。

高级特性

[编辑 | 编辑源代码]

Ruby 包含许多高级特性。

  • 异常 用于错误处理。
  • 标记清除垃圾回收器,而不是引用计数
  • 与操作系统无关的线程,允许您即使在 DOS 等操作系统上也能编写多线程应用程序。(此特性将在 1.9中消失,它将使用本机线程)

您还可以使用C编写 Ruby 扩展,或将 Ruby 嵌入到其他软件中。

参考文献

[编辑 | 编辑源代码]
  1. a b Bruce Stewart (2001年11月29日). "Ruby 创建者访谈". O'Reilly. 检索日期2006-09-11.
  2. "下载 Ruby". 检索日期2006-09-11.
  3. a b "关于 Ruby". 检索日期2006-09-11.
华夏公益教科书