内容 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11

官方 Ruby FAQ

如果您希望报告错误或对本 FAQ 提出改进建议,请访问我们的 GitHub 仓库,并提出 issue 或 pull request。

一般性问题

什么是 Ruby?

Ruby 是一种简单而强大的面向对象编程语言,由松本行弘(在本文档和邮件列表中,他使用化名“Matz”)创建。

与 Perl 类似,Ruby 在文本处理方面表现出色。与 Smalltalk 类似,Ruby 中的一切都是对象,并且 Ruby 拥有块、迭代器、元类和其他优点。

你可以使用 Ruby 编写服务器,进行原型实验,以及进行日常编程任务。作为一种完全集成的面向对象语言,Ruby 具有良好的可伸缩性。

Ruby 的特点

  • 简单的语法,
  • 基本的 OO 特性(类、方法、对象等),
  • 特殊的 OO 特性(混入、单例方法、重命名等),
  • 运算符重载,
  • 异常处理,
  • 迭代器和闭包,
  • 垃圾回收,
  • 动态加载(取决于架构),
  • 高度的可移植性(可在各种 Unix、Windows、DOS、macOS、OS/2、Amiga 等系统上运行)。

给我看一些 Ruby 代码!

让我们定义一个名为 Person 的类,它包含姓名和年龄。我们将通过创建几个人并检查他们来测试我们的代码。

class Person
  attr_accessor :name, :age

  def initialize(name, age)
    @name = name
    @age  = age.to_i
  end

  def inspect
    "#{name} (#{age})"
  end
end

p1 = Person.new("Elmo", 4)
p2 = Person.new("Zoe", 7)

p1  # => Elmo (4)
p2  # => Zoe (7)

现在,我们通过从 ages 文件中读取姓名和年龄来填充一个人员数组,该文件包含类似以下的行:

Bert:    8
Cookie: 11
Elmo:    4
Ernie:   8
Zoe:     7

该代码使用正则表达式解析输入文件中的连续行,为每个匹配项创建一个新的 Person 对象,并将其推入 people 数组的末尾。

people = Array.new

File.foreach("ages") do |line|
  people << Person.new($1, $2) if line =~ /(.*):\s+(\d+)/
end

people  # => [Bert (8), Cookie (11), Elmo (4), Ernie (8), Zoe (7)]

现在,让我们根据人的年龄对结果进行排序。有多种方法可以做到这一点。我们可以定义一个排序块,它告诉 Ruby 如何比较两个人。

sorted = people.sort {|a, b| a.age <=> b.age }
sorted  # => [Elmo (4), Zoe (7), Bert (8), Ernie (8), Cookie (11)]

另一种方法是更改 Person 类的比较方法。

class Person
  def <=>(other)
    age <=> other.age
  end
end
people.sort  # => [Elmo (4), Zoe (7), Bert (8), Ernie (8), Cookie (11)]

为什么叫做“Ruby”?

受 Perl 的影响,Matz 希望为他的新语言使用宝石的名称,因此他以同事的生日石命名 Ruby。

后来,他意识到 Ruby 在许多情况下都排在 Perl 之后。在生日石中,珍珠是六月,红宝石是七月。在测量字体大小时,珍珠是 5pt,红宝石是 5.5pt。他认为 Ruby 是一个很好的名字,适合比 Perl 更新(并希望更好)的编程语言。

(基于 Matz 在 1999 年 6 月 11 日的 [ruby-talk:00394] 中的解释。)

Ruby 的历史是什么?

以下是 Matz 于 1999 年 6 月 4 日在 [ruby-talk:00382] 中发布的一篇帖子的摘要。(Ruby 的生日已在 [ruby-list:15977] 中更正。)

嗯,Ruby 出生于 1993 年 2 月 24 日。我当时正在和我的同事讨论一种面向对象的脚本语言的可能性。我知道 Perl(Perl4,不是 Perl5),但我并不真正喜欢它,因为它闻起来像一个玩具语言(它仍然如此)。面向对象的脚本语言似乎非常有前途。

我当时知道 Python。但我不喜欢它,因为我不认为它是一种真正的面向对象语言——OO 特性似乎是语言的附加功能。作为一个 15 年的语言狂热者和 OO 爱好者,我真的想要一种真正的面向对象、易于使用的脚本语言。我找了,但找不到。

所以,我决定自己制作。解释器能够运行花了几个月的时间。我将我喜欢在我的语言中拥有的功能,例如迭代器、异常处理、垃圾回收等都放了进去。

然后,我将 Perl 的功能重组为一个类库,并实现了它们。我于 1995 年 12 月将 Ruby 0.95 发布到日本国内的新闻组。

从那时起,已经建立了高度活跃的邮件列表和网页。

Ruby 主页在哪里?

官方 Ruby 主页是 www.ruby-lang.org。除了英语和日语版本外,还有各种其他语言的翻译。

查找 Ruby 信息的好起点是文档社区页面。

有 Ruby 新闻组吗?

comp.lang.ruby 于 2000 年 5 月成立(感谢 Conrad Schneiker 的努力)。

有 Ruby 邮件列表吗?

有几个邮件列表在讨论 Ruby。有关更多信息,请参阅邮件列表页面。

您可以使用https://ml.ruby-lang.org/archives/list/ruby-talk@ml.ruby-lang.org/搜索邮件列表存档。(这是 ruby-talk 列表的 URL,根据需要为其他列表进行调整。)

如何在 mutt 中对邮件列表进行主题排序?

本节或部分内容可能已过时或需要确认。

对于一些 Ruby 邮件列表,邮件列表软件会在主题行中添加前缀,例如 ruby-core:1234。这可能会导致某些邮件用户代理的主题排序混乱。

在 mutt 中,您可以使用以下变量设置来使主题排序正常工作。

# reply regexp, to support MLs like ruby-talk.
set reply_regexp="^(\[[a-z0-9:-]+\][[:space:]]*)?(re([\[0-9\]+])*|aw):[[:space:]]*"

哪个是正确的,“Ruby”还是“ruby”?

官方称该语言为“Ruby”。在大多数系统中,它使用 ruby 命令调用。使用“ruby”代替“Ruby”是可以的。

请不要将“RUBY”用作语言名称。

最初或历史上,它被称为“ruby”。

有 Ruby 书籍吗?

本节或部分内容可能已过时或需要确认。

  • 《Programming Ruby: The Pragmatic Programmer’s Guide》(即“Pickaxe Book”),作者:David Thomas 和 Andrew Hunt:ISBN 0-20171-089-7,Addison-Wesley,2000 年 10 月。

  • Matz 等人编写的日语 Ruby 参考书由 ASCII 在日本出版(ISBN 4-7561-3254-5)。O’Reilly & Associates 出版了英文翻译版《The Ruby Programming Language》(ISBN 978-0596516178)。

  • O’Reilly Japan 出版了日语版的《Ruby Pocket Reference》(ISBN 4-87311-023-8)。如果您希望看到英文翻译版,请告知美国 O’Reilly。

  • 此外,Jeffrey Friedl 的《Mastering Regular Expressions》(即“Hip Owl Book”):ISBN 1-56592-257-3,由 O’Reilly & Associates 出版,是一本参考书,涵盖了各种编程语言中正则表达式的艺术和实现。其中大部分内容与 Ruby 正则表达式高度相关。

哪些编辑器支持 Ruby?

本节或部分内容可能已过时或需要确认。

如何用结果注释 Ruby 代码?

本节或部分内容可能已过时或需要确认。

人们通常通过显示每条语句的执行结果作为注释附加到该语句来注释 Ruby 代码。例如,在以下代码中,我们显示赋值生成字符串“Billy Bob”,然后是提取一些子字符串的结果。

str = "Billy" + " Bob"           # => "Billy Bob"
str[0,1] + str[2,1] + str[-2,2]  # => "Blob"

Emacs 和 vim 用户可以将此集成到他们的编辑环境中,如果您想通过带注释的 Ruby 代码发送电子邮件给他人,这将非常有用。安装 xmp 后,Emacs 用户可以将其添加到 .emacs 文件中。

(defun ruby-xmp-region (reg-start reg-end)
  "Pipe the region through Ruby's xmp utility and replace the region with
   the result."
  (interactive "r")
  (shell-command-on-region reg-start reg-end
                           "ruby -r xmp -n -e 'xmp($_, \"%l\t\t# %r\n\")'"
                           t))
(global-set-key [(meta f10)] 'ruby-xmp-region)

Vim 用户可以使用映射(感谢 hipster)。

map <M-F10> :!ruby -r xmp -n -e 'xmp($_, "\%l\t\t\# \%r\n")'<CR>

在这两种情况下,请突出显示一段代码并按 Meta-F10 来注释它。

即使读了手册,我也无法理解 Ruby!

本节或部分内容可能已过时或需要确认。

自 Ruby 1.0 以来,Ruby 的语法一直相对稳定,但时不时会添加新功能。因此,书籍和在线文档可能会滞后。

如果您遇到问题,请随时在邮件列表中提问(请参阅邮件列表页面)。通常,您会及时收到语言作者 Matz 本人、其他专家以及那些解决过与您类似问题的人的答复。

请在提供任何有问题的源代码时,附上 ruby -v 的输出。

如果您在使用irb时遇到问题,请注意它存在一些限制。请尝试使用 irb --single-irb 脚本,或直接使用 ruby 命令。

邮件列表中可能存在类似的问题,并且在提问之前阅读最近的邮件(RFC1855:3.1.1, 3.1.2)是良好的网络礼仪。但请务必在列表中提问,您会得到正确的答复。