如何利用 IRB 探索 Ruby

介绍

IRB,简称Interactive Ruby,是一个快速的方式来探索Ruby编程语言,并尝试代码而不创建一个文件。IRB是一个(阅读-Eval-Print Loop)(https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop),或 REPL,这是许多现代编程语言提供的工具。

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

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

启动和停止IRB

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

1irb

您将受到IRB提示的欢迎:

1[secondary_label IRB session]
2irb(main):001:0>

提示表示您正在运行 IRB,并且您执行的任何内容都将运行在主要环境中,这是 Ruby 程序的顶级默认环境。

<$>[注意] 注意:如果您已经安装了Ruby与RVM,您的提示可能看起来略有不同,显示版本号:

1[secondary_label IRB session from RVM]
22.4.0 :001 >

要在本教程中看到提示,请使用irb --prompt inf-ruby启动IRB。

IRB 接受 Ruby 语法,您可以在提示中输入。

12 + 2

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

1[secondary_label IRB session]
2=> 4

符号=>会告诉您,这是Ruby表达式的返回值。

要退出 IRB,请在提示中键入退出,或按CTRL+D

让我们通过看看如何使用它来探索代码来深入地挖掘IRB。

在 IRB 会话中执行代码

IRB 是一个很好的方法来测试代码,看看它是否对您的问题有好解决方案. Ruby 中的几乎所有东西都会返回某种值,并且每次在 IRB 中执行一个陈述时,你会看到该返回值被打印到屏幕上。

要证明这一点,在新的 IRB 会话中执行此陈述:

1puts "Hello World"

当你按下ENTER键时,你会看到两个IRB的结果:

1[secondary_label OUTPUT]
2Hello World
3=> nil

第一個結果是「puts」方法的输出,它打印了您指定的字符串,接著是行打破。「puts」方法打印了文本到標準的输出裝置,即您的屏幕,但「puts」方法有返回值,因為Ruby中的每一种方法都有返回值。

每次执行语句时,提示变更,表示一个新的行号码:

1irb(main):001:0> puts "Hello World"
2Hello World
3=> nil
4irb(main):002:0>

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

您可以将值分配给 IRB 会话中的变量,就像您在独立的 Ruby 程序中一样。

1birth_year = 1868

您将看到此陈述的返回值回响:

1[secondary_label IRB session]
2=> 1868

变量 birth_year 持有此值,但由于大多数 Ruby 返回值的陈述,IRB 也将向您显示返回值。

添加两个更大的变量: 首先,创建一个名为death_year的变量:

1death_year = 1921

然后通过从death_year中扣除birth_year来创建age_at_death变量:

1age_at_death = death_year - birth_year

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

1[secondary_label IRB session]
2=> 53

当您处于 IRB 会话中时,您不需要使用明确的插入打印语句,如果您不希望,因为您将看到您的返回值。

有时你会想要编写跨多个行的代码。IRB直观地支持此功能。IRB只执行语法完整的代码。以下Ruby代码使用鲨鱼的数组(https://andsky.com/tech/tutorials/how-to-work-with-arrays-in-ruby)并使用选择方法只返回含有名字中的字母a的鲨鱼。输入此代码到您的IRB会话中,按一下每个行之后的ENTER:

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

IRB 允许您输入多个代码行,但它只执行代码,当它认为代码是语法完整时. 请注意,提示变更表明 IRB 尚未通过使用星座(*)来评估您的代码,并将最终零变为一个,以表示不同的范围:

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

由于第一个行包含关键字,所以IRB不会试图执行任何东西,直到它遇到结束关键字。

1[secondary_label IRB session]
2=> ["Great White"]

使用IRB,您可以测试代码的位数,看看它们在将其纳入自己的程序之前如何工作。

使用图书馆和宝石

这些库可以是包含在Ruby的标准库的东西,你自己写的东西,或 gems,通过Rubygems.org(http://rubygems.org)分发的Ruby库,你使用``命令安装。

Ruby 的标准库包括用于创建 Web 请求和获取结果的模块,您可以在 IRB 会话中使用这些模块,就像在 Ruby 程序中一样。

使用要求语句从 Ruby 的标准库中导入 Net/HTTP

1require 'net/http'

IRB表示此声明返回,这告诉你库已成功加载,现在输入此代码到 IRB 以向icanhazip.com发出请求,以获取您的外部 IP 地址:

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

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

1[secondary_label IRB session]
2irb(main):010:0> uri = URI.parse("http://icanhazip.com")
3=> #<URI::HTTP http://icanhazip.com>
4irb(main):011:0> response = Net::HTTP.get_response uri
5=> #<Net::HTTPOK 200 OK readbody=true>
6irb(main):012:0> response.body
7=> 203.0.113.52\n

如果找不到一个库,你会看到不同的答案. 尝试导入 HTTParty 库,这使得处理 HTTP 请求更容易:

1require 'httparty'

你会看到这个消息:

1[secondary_label IRB session]
2LoadError: cannot load such file -- httparty

此消息告訴你,你想要的圖書館無法使用。 HTTParty 被分發為一塊寶石,所以你必須安裝它。 使用「CTRL+D」退出你的 IRB 會議或輸入「退出」來返回你的提示。 然後使用「gem」命令來安裝「httparty」寶石:

1[environment local]
2gem install httparty

现在,重新启动IRB

1[environment local]
2irb

在您的 IRB 会话中,输入以下代码:

1require 'httparty`

这一次,IRB会显示真实,告诉你它能够加载图书馆。

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

你会看到输出打印到屏幕上:

1[secondary_label IRB session]
2=> 203.0.113.52\n

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

将您的代码加载到IRB

如果您启动IRB会话并使用-r交换机,您可以指定在IRB启动时要加载的库或宝石,例如,irb -r httparty会启动一个IRB会话,并且已经加载了httparty宝石,这意味着您可以跳过明确的要求 httparty声明。

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

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

创建一个名为ip_grabber.rb的新Ruby文件,该文件定义一个IPGrabber对象,使用get方法,当提供URL时,会返回机器的外部IP地址。您将使用HTTParty库从icanhazip.com获取响应。

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

 1[label ip_grabber.rb]
 2require 'httparty'
 3class IPGrabber
 4
 5def initialize()
 6@url = "http://icanhazip.com"
 7end
 8
 9def get
10response = HTTParty.get(@url)
11response.body.chomp # remove the \n if it exists
12end
13end

保存文件并离开编辑器。

然后启动 IRB 并加载此文件. 因为它是本地文件而不是宝石或内置库,您必须指定路径。

1[environment local]
2irb -r ./ip_grabber

IRB 会话加载,您可以在会话中开始使用此新对象:

1ip = IPGrabber.new
2ip.get

你会看到这个输出:

1[secondary_label IRB session]
2=> 203.0.113.52

通过将自己的代码加载到 IRB 会话中,您可以在将其纳入完整程序之前检查代码并使用自己的库。

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

个性化 IRB

您可以创建一个名为.irbrc的配置文件,允许您定制您的 IRB 会话,然后您可以添加自动完成、插入和命令历史的支持。

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

1[environment local]
2nano ~/.irbrc

首先,在 IRB 中配置自动完成支持,这将允许您使用TAB键在 IRB 中自动完成对象、变量名称和方法名称:

1[label ~/.irbrc]
2require 'irb/completion'

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

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

有了此功能,您输入的最后1000个陈述将登录到您的主目录中的 .irb_history 文件中。

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

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

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

接下来,将此行添加到配置文件中,以启用自动检索,这在写类、方法和块时非常有用:

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

您的配置文件可以包含任何额外的有效的 Ruby 代码,这意味着您可以定义辅助方法或使用要求来加载额外的库。

1[label .irbrc]
2def history
3history_array = Readline::HISTORY.to_a
4print history_array.join("\n")
5end

当您加载您的 IRB 会话时,请输入历史以查看您的 IRB 历史. 您可能有很多,所以您可以更改历史命令,以便它需要一个可选的行数来显示。

 1[label .irbrc]
 2
 3# history command
 4def history(count = 0)
 5
 6# Get history into an array
 7history_array = Readline::HISTORY.to_a
 8
 9# if count is > 0 we'll use it.
10# otherwise set it to 0
11count = count > 0 ? count : 0
12
13if count > 0
14from = history_array.length - count
15history_array = history_array[from..-1]
16end
17
18print history_array.join("\n")
19end

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

虽然您可以使用.irbrc 来加载您经常使用的库,但请记住,每次加载的库都会增加 IRB 会话的加载时间,这可能会使其更不愉快使用。

结论

IRB提供了一个地方来实验Ruby代码,这是一个很好的方法来处理程序逻辑,然后把它放在一个文件。

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

理解 Ruby 中的数据类型

Published At
Categories with 技术
Tagged with
comments powered by Disqus