如何使用IRB来浏览Ruby

IRB(Interactive Ruby的简称)是一种快速探索Ruby编程语言的方法,可以在不创建文件的情况下尝试代码。在本教程中,您将使用IRB运行一些代码,检查其输出,引入外部库,并自定义您的IRB会话。

介绍

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(main):001:0>

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

注意 :如果你已经用RVM安装了Ruby,你的提示可能会略有不同,显示版本号:

2.4.0 :001 >

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

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

2 + 2

按下ENTER键,IRB将显示结果:

=> 4

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

要退出IRB,请在提示中键入exit或按CTRL+D 你会返回到你的shell提示符。

让我们深入研究IRB,看看如何使用它来探索代码。

在IRB会话中执行代码

IRB是一个很好的方式来测试代码,看看它是否是一个很好的解决方案。 几乎Ruby中的所有内容都会返回一些值,每次在IRB中执行语句时,都会看到返回值打印在屏幕上。

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

puts "Hello World"

当你按下ENTER键时,你会看到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的变量:

death_year = 1921

然后通过从death_year减去birth_year来创建变量death_year

age_at_death = death_year - birth_year

IRB将该值赋予变量,但也会显示结果:

=> 53

当您在IRB会话中时,如果您不想使用明确的putsprint语句,您将不会看到显示的返回值。

有时你会想要编写跨越多行的代码。 IRB直观地支持这一点。 IRB只执行句法完整的代码。 下面的Ruby代码使用了一鲨鱼,并使用select方法只返回名称中包含字母“a”的鲨鱼。 在IRB会话中ENTER以下代码,每行之后按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来处理外部库。

使用库和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(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文件,它使用get方法定义IPGrabber对象,当提供URL时,将返回机器的外部IP地址。 我们将使用HTTParty库来获取icanhazip.com的响应。 我们将在我们自己的程序中使用这个IPGrabber对象来使我们的代码免受外部变化的影响; 使用我们的obect可以让我们切换出底层的库和我们用来解析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

你会看到这个输出:

=> 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来加载其他库。 例如,要向您的IRB会话中添加一个history助手来显示您的历史记录,请将此代码添加到.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 = 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运行示例。