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

官方 Ruby 常见问题解答

如果您想报告此常见问题解答中的错误或提出改进建议,请访问我们的 GitHub 仓库 并提交 issue 或 pull request。

一般问题

什么是 Ruby?

Ruby 是一种简单而强大的面向对象编程语言,由 Yukihiro Matsumoto(在本文件中和邮件列表中使用 “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》(镐头书),作者:David Thomas 和 Andrew Hunt:ISBN 0-20171-089-7,Addison-Wesley,2000 年 10 月。

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

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

  • 此外,《Mastering Regular Expressions》,作者:Jeffrey Friedl,(猫头鹰书):来自 O’Reilly & Associates 的 ISBN 1-56592-257-3,是一本参考书,涵盖了各种编程语言中正则表达式的艺术和实现。其中大部分与 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)是一种良好的网络礼仪。但请务必在列表中提问,将会得到正确的答案。