介绍
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运行示例。