介绍
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 irb --prompt inf-ruby
。
IRB接受Ruby语法,可以在提示符下输入。 尝试通过添加两个数字在一起:
2 + 2
按下ENTER
键,IRB将显示结果:
IRB session=> 4
=>
符号让你知道这是Ruby表达式的返回值。
要退出IRB,请在提示中键入exit
或按CTRL+D
你会返回到你的shell提示符。
让我们深入研究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会话中执行更复杂的表达式时调试语句,因为错误消息将引用行号。
您可以像在独立的Ruby程序中那样,为IRB会话中的变量赋值。 通过在你的IRB会话中输入它并按下ENTER
来执行这个语句:
birth_year = 1868
你会看到这个语句的返回值回显:
IRB session=> 1868
变量birth_year
保存这个值,但是,由于Ruby中的大多数语句返回值,IRB在这里也显示了返回值。
再添加两个变量。 首先,创建一个名为death_year
的变量:
death_year = 1921
然后通过从death_year
减去birth_year
来创建变量death_year
:
age_at_death = death_year - birth_year
IRB将该值赋予变量,但也会显示结果:
IRB session=> 53
当您在IRB会话中时,如果您不想使用明确的puts
或print
语句,您将不会看到显示的返回值。
有时你会想要编写跨越多行的代码。 IRB直观地支持这一点。 IRB只执行句法完整的代码。 下面的Ruby代码使用了一鲨鱼,并使用方法只返回名称中包含字母“a”的鲨鱼。 在IRB会话中ENTER
以下代码,每行之后按ENTER
:
["Tiger", "Great White", "Angel"].select do |shark|
shark.include?("a")
end
IRB允许你输入多行代码,但是只有当它认为代码在语法上完成时才执行代码。 请注意,提示符更改为表示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来处理外部库。
使用库和Gem
您可以使用require
语句将库导入到IRB会话中,就像在Ruby程序中一样。 这些库可以是Ruby标准库中包含的东西,您自己写的东西,或者是使用gem
命令安装的Rubygems.org分发的Ruby库。
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分发的,所以我们必须安装它。 使用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
你会看到输出打印到屏幕上:
IRB session=> 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文件,它使用get
方法定义IPGrabber
对象,当提供URL时,将返回机器的外部IP地址。 我们将使用HTTParty库来获取icanhazip.com
的响应。 我们将在我们自己的程序中使用这个IPGrabber
对象来使我们的代码免受外部变化的影响; 使用我们的obect可以让我们切换出底层的库和我们用来解析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
来加载其他库。 例如,要向您的IRB会话中添加一个history
助手来显示您的历史记录,请将此代码添加到.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 = hist.length - count
history_array = history_array[from..-1]
end
print history_array.join("\n")
end
保存文件并开始一个新的IRB会话。 然后键入history 2
,你只会看到你的历史的最后两个。
虽然您可以使用.irbrc
来加载您经常使用的库,但请记住,您加载的每个库都会增加IRB会话的加载时间,从而使其使用起来不那么愉快。 用require
语句手动加载特定的库文件通常会更好。
结论
IRB提供了一个试验Ruby代码的地方。 在将程序逻辑放入文件之前,这是一个很好的方法。
既然您已经习惯了IRB,那么您可以使用它来学习Ruby的各种数据类型,方法是遵循这些教程并使用IRB运行示例。