介绍
IRB 是 Interactive Ruby 的缩写,是一种无需创建文件即可快速探索 Ruby 编程语言和测试代码的方法。IRB 是Read-Eval-Print Loop或REPL,这是许多现代编程语言提供的工具。要使用它,您需要启动irb
可执行文件并在提示符下键入您的 Ruby 代码。IRB 评估您键入的代码并显示结果。
通过 IRB,您可以访问 Ruby 的所有内置功能,以及您安装的任何库或 gem。此外,您可以配置 IRB 以保存您的命令历史记录,甚至可以启用代码的自动完成功能。
在本教程中,您将使用 IRB 运行一些代码、检查其输出、引入外部库并自定义您的 IRB 会话。
启动和停止 IRB
如果您安装了Ruby,您将拥有 IRB。您可以在任何安装了 Ruby 的计算机上通过irb
从命令行界面执行命令来启动它。
- irb
您将收到 IRB 提示:
IRB sessionirb(main):001:0>
该提示表明您正在运行 IRB,并且您执行的任何内容都将在main
上下文中运行,这是 Ruby 程序的顶级默认上下文。它还显示一个行号。
注意:如果您已经使用 RVM 安装了 Ruby,您的提示可能看起来略有不同,而是显示版本号:
IRB session from RVM2.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 的两个结果:
OUTPUTHello 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 会话中时,如果您不想,您不必使用显式puts
orprint
语句,因为您将看到显示的返回值。
有时您会想要编写跨越多行的代码。IRB 直观地支持这一点。IRB 只执行语法完整的代码。以下 Ruby 代码使用鲨鱼数组并使用select方法仅返回名称中包含字母“a”的鲨鱼。将此代码输入您的 IRB 会话,ENTER
在每一行后按:
["Tiger", "Great White", "Angel"].select do |shark|
shark.include?("a")
end
IRB 允许您输入多行代码,但它仅在它认为代码在语法上完整时才执行该代码。请注意,通过使用星号 ( *
) 并将最后的零更改为 1 以指示不同的范围,提示会更改以指示 IRB 尚未评估您的代码:
IRB sessionirb(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 sessionirb(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 sessionLoadError: cannot load such file -- httparty
此消息告诉您所需的库不可用。HTTParty 是作为 gem 分发的,所以我们必须安装它。退出您的 IRB 会话CTRL+D
或键入exit
以返回到您的提示。然后使用gem
命令安装httparty
gem:
- 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 httparty
在httparty
gem 已经加载的情况下启动 IRB 会话,这意味着您可以跳过显式require httparty
语句。
但是,您也可以使用它来将您自己的代码加载到新会话中,这在您想要探索或测试它时很有帮助。
通过键入exit
或按退出您的 IRB 会话CTRL+D
。
创建一个名为的新 Ruby 文件ip_grabber.rb
,该文件定义了一个IPGrabber
对象get
,当提供一个 URL 时,该对象将返回机器的外部 IP 地址。我们将使用 HTTParty 库从icanhazip.com
. 我们将IPGrabber
在我们自己的程序中使用这个对象来将我们的代码与外部更改隔离;使用我们的对象可以让我们切换底层库和用于解析 IP 地址的站点,而无需更改其余代码的工作方式。
将此代码添加到文件以定义类:
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 中的对象、变量名称和方法名称:
require 'irb/completion'
接下来,添加对将命令历史记录保存到外部文件的支持。
IRB.conf[:SAVE_HISTORY] = 1000
启用此功能后,您键入的最后 1000 条语句将记录到.irb_history
主目录中的文件中。
此外,当您打开一个新的 IRB 会话时,您的历史记录将自动加载,您可以使用Up
和Down
箭头键在这些条目中移动,或用于CTRL+R
进行反向搜索,就像在 Bash shell 中一样。
如果您想指定不同的历史文件,请将其添加到您的配置文件中:
IRB.conf[:HISTORY_FILE] = '~/your_history_filename'
接下来,将此行添加到您的配置文件中以启用自动缩进,这在编写类、方法和块时非常方便:
IRB.conf[:AUTO_INDENT] = true
您的配置文件可以包含任何其他有效的 Ruby 代码,这意味着您可以定义辅助方法或用于require
加载其他库。例如,要将history
帮助程序添加到您的 IRB 会话以显示您的历史记录,请将此代码添加到.irbrc
:
def history
history_array = Readline::HISTORY.to_a
print history_array.join("\n")
end
当您加载 IRB 会话时,键入history
以查看您的 IRB 历史记录。您可能有很多,因此您可以更改history
命令,以便显示可选的行数。用以下代码替换该history
函数的代码,该代码接受一个可选参数,count
并使用它来限制它显示的条目:
# 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 的各种数据类型。