如何使用IRB来探索Ruby
引言
Interactive Ruby(IRB)是一种快速探索Ruby编程语言和尝试代码而不创建文件的方式。IRB是一个读取-求值-打印循环(REPL),许多现代编程语言提供的一种工具。要使用它,你启动irb可执行文件并在提示符下键入你的Ruby代码。IRB评估你键入的代码并显示结果。
IRB让您可以访问所有内置的Ruby功能,以及您安装的任何库或gems。此外,您还可以配置IRB来保存您的命令历史记录,甚至启用代码的自动补全。
在这个教程中,你将使用 IRB 运行一些代码,检查其输出,引入外部库,并自定义你的 IRB 会话。
开始和停止IRB
如果你已经安装了Ruby,你会有IRB。只需在安装有Ruby的任何计算机上执行命令“irb”即可启动它,命令行界面上。
- irb
你将会看到 IRB 提示符:
irb(main):001:0>
说明了你正在运行IRB,并且任何你执行的内容都将在主上下文中运行。主上下文是Ruby程序的顶级默认上下文。这还显示了一行代码的编号。
Note
RVM2.4.0中的IRB会话:001 >
要按照本教程中显示的提示,使用 irb –prompt inf-ruby 启动IRB。
IRB 接受 Ruby 语法,您可以在命令行提示符下输入。试着通过将两个数字相加来测试一下:
- 2 + 2
按下回车键,IRB 将会显示你的结果。
=> 4
“=>”符号让你知道这是来自Ruby表达式的返回值。
要退出IRB,请在提示符处键入exit或按CTRL+D。您将返回到shell提示符。
我们来深入探讨一下 IRB,看看如何使用它来探索代码。
在IRB会话中执行代码
IRB是一个很好的方法,可以尝试编写代码,以查看它是否是解决您问题的好方法。Ruby中的几乎所有内容都返回某个值,并且每次在IRB中执行语句时,您都会在屏幕上看到该返回值打印出来。
为了证明这一点,在新的IRB会话中执行这个语句。
- puts “Hello World”
当您按下回车键时,您将在IRB中看到两个结果。
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 会话中处理更复杂的表达式时进行调试,因为错误信息会提到具体的行号。
你可以像在独立的Ruby程序中一样,在IRB会话中为变量赋值。通过将该语句键入到IRB会话并按ENTER执行。
- birth_year = 1868
你会看到这个语句的返回值被回显出来:
=> 1868
变量birth_year保存了这个值,但是由于Ruby的大多数语句都返回值,所以IRB也在这里显示给你返回值。
添加两个变量。首先,请创建一个名为“死亡年份”的变量。
- death_year = 1921
然后通过将出生年份减去死亡年份来创建变量age_at_death。
- age_at_death = death_year – birth_year
但它还向你显示结果,将值分配给变量。
=> 53
当你在IRB会话中时,如果不想使用显式的puts或print语句,也没关系,因为你会看到返回值显示出来。
有时候你会想要编写跨越多行的代码。IRB在这方面有直观的支持。IRB只会执行语法完整的代码。下面的Ruby代码使用了一个鲨鱼数组,并使用select方法返回只包含字母“a”的鲨鱼名称。将这段代码输入到你的IRB会话中,每行按下ENTER键:
["Tiger", "Great White", "Angel"].select do |shark|
shark.include?("a")
end
IRB允许您输入多行代码,但仅当它认为代码在语法上是完整的时才执行代码。请注意,提示符会改变,以表示IRB尚未评估您的代码,它会使用一个星号(*),并将最后的零更改为一,以表示不同的范围。
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”關鍵詞。然後它會顯示結果。
=> [“Great White”]
使用IRB,您可以测试代码片段,以查看它们在合并到您自己的程序之前的工作方式。您还可以使用IRB与外部库进行工作。
使用库和宝石
您可以使用`require`语句将库导入到IRB会话中,就像在Ruby程序中一样。这些库可以是Ruby标准库中的一些东西,您自己编写的代码,或者是通过Rubygems.org分发的Ruby库,您可以使用`gem`命令进行安装。
Ruby的标准库包括用于发起网络请求和获取结果的模块。你可以在IRB会话中像在Ruby程序中一样使用这些模块。
使用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(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'
你将会看到这条消息:
LoadError: cannot load such file — httparty
这条消息告诉你所需的图书馆不可用。HTTParty作为一个gem进行分发,所以你必须安装它。使用CTRL+D退出你的IRB会话,或者输入exit返回到提示符。然后使用gem命令来安装httparty gem。
- gem install httparty
现在重新启动irb。
- irb
请再次加载这个模块。在你的IRB会话中,输入以下代码:
require 'httparty`
这次,IRB将显示“true”,以向您表明它能够加载库。将此代码输入到IRB中以进行尝试。
response = HTTParty.get("http://icanhazip.com")
response.body
你将会看到输出被打印到屏幕上。
=> 203.0.113.52\n
现在让我们看看如何使用IRB探索和测试你自己的Ruby代码。
将您的代码加载到IRB中
如果你启动一个IRB会话,并使用-r开关,你可以在IRB启动时指定你想要加载的库或gem。例如,irb -r httparty会启动一个已经加载了httparty gem的IRB会话,这意味着你可以跳过显式require httparty语句。
然而,您还可以使用它将自己的代码加载到一个新的会话中,这在您想要进行探索或测试时非常有帮助。
通过输入exit或按下CTRL+D来退出您的IRB会话。
创建一个名为ip_grabber.rb的新的Ruby文件,该文件定义了一个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
你会看到这个输出。
=> 203.0.113.52
通过将你自己的代码加载到 IRB 会话中,你可以检查代码,并在将其加入完整程序之前与你自己的库一起使用。
既然你已经知道如何在IRB会话中使用代码了,现在让我们来看看如何自定义你的IRB会话。
定制 IRB
您可以创建一个名为.irbrc的配置文件,从而定制您的IRB会话。您可以通过添加自动补全、缩进和命令历史记录功能来增强它。
在你的家目录下创建这个文件。
- nano ~/.irbrc
首先,在IRB中配置自动补全功能。这样可以让你在IRB中使用TAB键来自动补全对象、变量名和方法名。
~/.irbrc我的.irbrc文件
require 'irb/completion'
接下来,添加支持将您的命令历史保存到外部文件中。
IRB.conf[:SAVE_HISTORY] = 1000
启用此功能后,您在家目录中的.irb_history文件将记录您输入的最后1000条语句。
此外,当您打开一个新的IRB会话时,您的历史记录将自动加载,并且您可以使用上下箭头键浏览这些条目,或使用CTRL+R进行反向搜索,就像在Bash shell中一样。
如果您想指定一个不同的历史记录文件,请将此添加到您的配置文件中。
IRB.conf[:HISTORY_FILE] = '~/your_history_filename'
接下来,将这行代码添加到你的配置文件中以启用自动缩进。当编写类、方法和块时,这将非常方便。
~/.irbrc
IRB.conf[:AUTO_INDENT] = true
你的配置文件可以包含任何有效的Ruby代码,这意味着你可以定义帮助方法或使用require来加载额外的库。例如,要将历史助手添加到你的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的各种数据类型。
- Understanding Data Types in Ruby
- How To Work with Strings in Ruby
- How To Work with String Methods in Ruby
- How To Work with Arrays in Ruby
- How To Use Array Methods in Ruby