如何使用 IRB 探索 Ruby

介绍

IRB 是 Interactive Ruby 的缩写,是一种无需创建文件即可快速探索 Ruby 编程语言和测试代码的方法。IRB 是Read-Eval-Print LoopREPL,这是许多现代编程语言提供的工具。要使用它,您需要启动irb可执行文件并在提示符下键入您的 Ruby 代码。IRB 评估您键入的代码并显示结果。

通过 IRB,您可以访问 Ruby 的所有内置功能,以及您安装的任何库或 gem。此外,您可以配置 IRB 以保存您的命令历史记录,甚至可以启用代码的自动完成功能。

在本教程中,您将使用 IRB 运行一些代码、检查其输出、引入外部库并自定义您的 IRB 会话。

启动和停止 IRB

如果您安装了Ruby,您将拥有 IRB。您可以在任何安装了 Ruby 的计算机上通过irb从命令行界面执行命令来启动它

  • irb

您将收到 IRB 提示:

IRB session
irb(main):001:0>

该提示表明您正在运行 IRB,并且您执行的任何内容都将在main上下文中运行,这是 Ruby 程序的顶级默认上下文。它还显示一个行号。

注意:如果您已经使用 RVM 安装了 Ruby,您的提示可能看起来略有不同,而是显示版本号:

IRB session from RVM
2.4.0 :001 >

要获得本教程中显示的提示,请使用 irb --prompt inf-ruby.

IRB 接受 Ruby 语法,您可以在提示符下输入。通过将两个数字相加来尝试一下:

  • 2 + 2

ENTER键,IRB 将显示结果:

IRB session
=> 4

=>符号让您知道这是 Ruby 表达式的返回值。

要退出 IRB,请exit在提示符下键入,或按CTRL+D您将返回到 shell 提示符。

让我们通过查看如何使用 IRB 来探索代码来更深入地研究 IRB。

在 IRB 会话中执行代码

IRB 是一种很好的方式来尝试代码,看看它是否是解决问题的好方法。Ruby 中的几乎所有东西都会返回一些值,每次在 IRB 中执行语句时,您都会看到该返回值打印在屏幕上。

为了证明这一点,请在新的 IRB 会话中执行以下语句:

  • puts "Hello World"

当您按下该ENTER键时,您将看到来自 IRB 的两个结果:

OUTPUT
Hello World => nil

第一个结果是该puts方法的输出,它打印您指定的字符串,后跟一个换行符。puts方法将文本打印到标准输出设备,即您的屏幕。但是该puts方法有一个返回值,因为Ruby 中的每个方法都有一个返回值。puts方法返回nil,这就是 IRB 向您展示的内容。

每次执行语句时,提示都会改变,指示一个新的行号:

irb(main):001:0> puts "Hello World"
Hello World
=> nil
irb(main):002:0>

这可以帮助您在 IRB 会话中执行更复杂的表达式时调试语句,因为错误消息将引用行号。

您可以在 IRB 会话中为变量赋值,就像在独立的 Ruby 程序中一样。通过在您的 IRB 会话中键入并按 来执行此语句ENTER

  • birth_year = 1868

您将看到此语句的返回值回显:

IRB session
=> 1868

该变量birth_year保存该值,但是,由于 Ruby 中的大多数语句都返回值,因此 IRB 也会在此处显示返回值。

再添加两个变量。首先,创建一个名为 的变量death_year

  • death_year = 1921

然后age_at_death通过减去以下birth_year创建变量death_year

  • age_at_death = death_year - birth_year

IRB 将值分配给变量,但也会向您显示结果:

IRB session
=> 53

当您在 IRB 会话中时,如果您不想,您不必使用显式putsorprint语句,因为您将看到显示的返回值。

有时您会想要编写跨越多行的代码。IRB 直观地支持这一点。IRB 只执行语法完整的代码。以下 Ruby 代码使用鲨鱼数组并使用select方法仅返回名称中包含字母“a”的鲨鱼。将此代码输入您的 IRB 会话,ENTER在每一行后

["Tiger", "Great White", "Angel"].select do |shark|
   shark.include?("a")
end

IRB 允许您输入多行代码,但它仅在它认为代码在语法上完整时才执行该代码。请注意,通过使用星号 ( *) 并将最后的零更改为 1 以指示不同的范围,提示会更改以指示 IRB 尚未评估您的代码

IRB session
irb(main):005:0> ["Tiger", "Great White", "Angel"].select do |shark| irb(main):006:1* shark.include?("a") irb(main):007:1> end

由于第一行包含do关键字,IRB 在遇到end关键字之前不会尝试执行任何操作。然后它显示结果:

IRB session
=> ["Great White"]

使用 IRB,您可以测试一些代码,在将它们合并到您自己的程序中之前查看它们将如何工作。您还可以使用 IRB 来处理外部库。

使用库和 Gems

您可以使用该require语句将库导入 IRB 会话,就像在 Ruby 程序中一样。这些库可以是包含在 Ruby 标准库中的内容、您自己编写的内容,也可以是gems、通过Rubygems.org分发的 Ruby 库,您可以使用gem命令安装它们

Ruby 的标准库包括用于发出 Web 请求和获取结果的模块。您可以像在 Ruby 程序中一样在 IRB 会话中使用它们。

使用该require语句从 Ruby 的标准库导入Net/HTTP在您的 IRB 会话中输入以下代码行,然后按ENTER

require 'net/http'

IRB 表示该语句返回true,说明库加载成功。现在将此代码输入 IRB 以请求icanhazip.com获取您的外部 IP 地址:

uri = URI.parse("http://icanhazip.com")
response = Net::HTTP.get_response uri
response.body

当您输入每一行时,IRB 会向您显示返回值,因此您可以调试每个步骤:

IRB session
irb(main):010:0> uri = URI.parse("http://icanhazip.com") => #<URI::HTTP http://icanhazip.com> irb(main):011:0> response = Net::HTTP.get_response uri => #<Net::HTTPOK 200 OK readbody=true> irb(main):012:0> response.body => 203.0.113.52\n

如果找不到库,您会看到不同的响应。尝试导入HTTParty库,这使得处理 HTTP 请求更容易一些:

require 'httparty'

你会看到这条消息:

IRB session
LoadError: cannot load such file -- httparty

此消息告诉您所需的库不可用。HTTParty 是作为 gem 分发的,所以我们必须安装它。退出您的 IRB 会话CTRL+D或键入exit以返回到您的提示。然后使用gem命令安装httpartygem:

  • gem install httparty

现在irb再次启动

  • irb

再次尝试加载模块。在您的 IRB 会话中,输入以下代码:

require 'httparty`

这一次,IRB 将显示true,让您知道它能够加载库。将此代码输入 IRB 以进行尝试:

response = HTTParty.get("http://icanhazip.com")
response.body

您将看到打印到屏幕上的输出:

IRB session
=> 203.0.113.52\n

现在让我们看看如何使用 IRB 探索和测试您自己的 Ruby 代码。

将您的代码加载到 IRB

如果您启动 IRB 会话并使用-r开关,您可以指定要在 IRB 启动时加载的库或 gem。例如,irb -r httpartyhttpartygem 已经加载的情况下启动 IRB 会话,这意味着您可以跳过显式require httparty语句。

但是,您也可以使用它来将您自己的代码加载到新会话中,这在您想要探索或测试它时很有帮助。

通过键入exit或按退出您的 IRB 会话CTRL+D

创建一个名为的新 Ruby 文件ip_grabber.rb,该文件定义了一个IPGrabber对象get,当提供一个 URL 时,对象将返回机器的外部 IP 地址。我们将使用 HTTParty 库从icanhazip.com. 我们将IPGrabber在我们自己的程序中使用这个对象来将我们的代码与外部更改隔离;使用我们的对象可以让我们切换底层库和用于解析 IP 地址的站点,而无需更改其余代码的工作方式。

将此代码添加到文件以定义类:

ip_grabber.rb
require 'httparty'
class IPGrabber

  def initialize()
    @url = "http://icanhazip.com"
  end

  def get
    response = HTTParty.get(@url)
    response.body.chomp  # remove the \n if it exists
  end
end

保存文件并退出编辑器。

然后启动 IRB 并加载此文件。由于它是本地文件而不是 gem 或内置库,因此我们必须指定路径。我们也不需要指定.rb文件扩展名。

  • irb -r ./ip_grabber

IRB 会话加载,您可以开始在会话中使用这个新对象,如下所示:

ip = IPGrabber.new
ip.get

你会看到这个输出:

IRB session
=> 203.0.113.52

通过将您自己的代码加载到 IRB 会话中,您可以检查代码并使用您自己的库,然后再将它们合并到一个完整的程序中。

现在您知道如何在 IRB 会话中使用代码,让我们看看如何自定义您的 IRB 会话。

自定义 IRB

您可以创建一个名为的配置文件.irbrc,用于自定义 IRB 会话。然后,您可以添加对自动完成、缩进和命令历史记录的支持。

在您的主目录中创建此文件:

  • nano ~/.irbrc

首先,在 IRB 中配置自动完成支持。这将让您使用TAB密钥来自动完成 IRB 中的对象、变量名称和方法名称:

~/.irbrc
require 'irb/completion'

接下来,添加对将命令历史记录保存到外部文件的支持。

~/.irbrc
IRB.conf[:SAVE_HISTORY] = 1000

启用此功能后,您键入的最后 1000 条语句将记录到.irb_history主目录中文件中。

此外,当您打开一个新的 IRB 会话时,您的历史记录将自动加载,您可以使用UpDown箭头键在这些条目中移动,或用于CTRL+R进行反向搜索,就像在 Bash shell 中一样。

如果您想指定不同的历史文件,请将其添加到您的配置文件中:

~/.irbrc
IRB.conf[:HISTORY_FILE] = '~/your_history_filename'

接下来,将此行添加到您的配置文件中以启用自动缩进,这在编写类、方法和块时非常方便:

~/.irbrc
IRB.conf[:AUTO_INDENT] = true

您的配置文件可以包含任何其他有效的 Ruby 代码,这意味着您可以定义辅助方法或用于require加载其他库。例如,要将history帮助程序添加到您的 IRB 会话以显示您的历史记录,请将此代码添加到.irbrc

.irbrc
def history
  history_array = Readline::HISTORY.to_a
  print history_array.join("\n")
end

当您加载 IRB 会话时,键入history以查看您的 IRB 历史记录。您可能有很多,因此您可以更改history命令,以便显示可选的行数。用以下代码替换该history函数的代码,该代码接受一个可选参数,count并使用它来限制它显示的条目:

.irbrc

# history command
def history(count = 0)

  # Get history into an array
  history_array = Readline::HISTORY.to_a

  # if count is > 0 we'll use it.
  # otherwise set it to 0
  count = count > 0 ? count : 0

  if count > 0
    from = history_array.length - count
    history_array = history_array[from..-1] 
  end

  print history_array.join("\n")
end

保存文件并开始新的 IRB 会话。然后键入history 2,您将只看到历史记录的最后两行。

虽然您可以使用.irbrc加载经常使用的库,但请记住,您加载的每个库都会增加 IRB 会话的加载时间,这可能会降低使用的乐趣。通常最好使用require语句手动加载特定的库

结论

IRB 提供了一个试验 Ruby 代码的地方。这是在将其放入文件之前计算程序逻辑的好方法。

现在您已经熟悉了 IRB,您可以通过遵循这些教程并使用 IRB 运行示例来使用它来探索 Ruby 的各种数据类型。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁