IRB ,irb
,全名 「 Interactive Ruby 」,是 Ruby 提供的一个交互式命令行解释工具。也就是说我们可以直接在 irb 中输入 Ruby 表达式,然后就立即可以得到该表达式的结果。
如果你安装了 Ruby,那么可以直接在命令行或终端或 Shell 中输入 irb
,就可以进入 Ruby irb 模式了.
[root@localhost ~]# irb .... # 此处省略一些启动文字 2.5.0 :001 >
IRB 用来实验一些小的代码片段非常有用,也非常便捷,但是啊,它呢,有时候,也是复杂的无比了。虽然很少出现,但是,总是会出现那么几次的。
庆幸的是,IRB 是可配置的
本章接下里的部分,我们将研究 IRB 两个非常方便的常见用例。
注意: 下面的示例依赖 Ruby 的 irb 和 Ruby on Rails 中的 console 控制台
IRB.CurrentContext
当我们在终端中打开一个 irb 时,会自动初始化一个 IRB::Context
实例,并保存在常量 IRB.CurrentContext
中。
irb> IRB.CurrentContext.class => IRB::Context irb>
IRB::Context
封装了 irb 会话的当前状态。
为了接下来讲解的简单期间,我们先承认它包含一堆配置的事实。因此,才会有机会对它进行一些小修小改。
禁止输出返回值
这是一个很奇葩的要求,但有时候很有用。IRB 默认情况下会直接输出最后一条执行指令的返回值。
irb> [1,2,3].map { |n| n * 2 } => [2, 4, 6]
但是,有时候这个返回值会非常复杂,文字特多,这就不好了,因为会污染了当前的 irb 会话
rails_console> User.limit(10).each do |u| p [u.id, u.first_name] if u.confirmed? end [1, "John"] [3, "John"] [5, "John"] [7, "John"] [9, "John"] => [#<User id: 1..>, #<User id: 2..>, #<User id: 3..>, #<User id: 4..>, #<User id: 5..>, #<User id: 6..>, #<User id: 7..>, #<User id: 8..>, #<User id: 9..>, #<User id: 10..>]
这种情况下,一个很古老的技巧就是 「 强制最后一条指令为空 」,也就是在所有的指令之后再添加一个指令 ;nil
rails_console> User.limit(10).each do |u| p [u.id, u.first_name] if u.confirmed? end; nil [1, "John"] [3, "John"] [5, "John"] [7, "John"] [9, "John"] => nil
这不久解决了问题了,对吧。
but,让我说一个但是,每次都手动拼接 ;nil
累不累啊 ?
累,所以,IRB::Context
提供了一种临时禁用返回值输出的方法,那就是使用 IRB::Context#echo
标志 ( flag )
rails_console> IRB.CurrentContext.echo = false # disable rails_console> User.limit(10).each do |u| p [u.id, u.first_name] if u.confirmed? end [1, "John"] [3, "John"] [5, "John"] [7, "John"] [9, "John"] rails_console> IRB.CurrentContext.echo = true # enable => true
禁用了之后,我们就没法获得最后一条语句的返回值了吗? 不是的,哈哈。IRB 早就想到了这点,为此,它提供了 IRB::Context#last_value
方法或 _
帮助器检索最后一条指令的返回值
rails_console> IRB.CurrentContext.echo = false # disable rails_console> User.limit(10).each do |u| p [u.id, u.first_name] if u.confirmed? end [1, "John"] [3, "John"] [5, "John"] [7, "John"] [9, "John"] rails_console> p IRB.CurrentContext.last_value [#<User id: 1..>, #<User id: 2..>, #<User id: 3..>, #<User id: 4..>, #<User id: 5..>, #<User id: 6..>, #<User id: 7..>, #<User id: 8..>, #<User id: 9..>, #<User id: 10..>] rails_console> p _ [#<User id: 1..>, #<User id: 2..>, #<User id: 3..>, #<User id: 4..>, #<User id: 5..>, #<User id: 6..>, #<User id: 7..>, #<User id: 8..>, #<User id: 9..>, #<User id: 10..>]
使用 IRB 追踪器 ( tracer )
当我们并不确定某段代码背后的内容时,我们可以使用 IRB 跟踪器
。
如果想要开启 IRB 的追踪器,可以将 IRB::Context#use_tracer
标志设置为 true
。
rails_console> IRB.CurrentContext.use_tracer = true => true rails_console> Rails.application lib/rails.rb:36:Rails:>: def application lib/rails.rb:37:Rails:-: @application ||= (app_class.instance if app_class) lib/rails.rb:38:Rails:<: end lib/rails/application.rb:363:Rails::Application:>: def config lib/rails/application.rb:364:Rails::Application:-: @config ||= Application::Configuration.new(self.class.find_root(self.class.called_fro lib/rails/application.rb:365:Rails::Application:<: end
追踪器会跟踪并显示原始语句隐式调用的所有方法。
显示当前的上下文
默认的,每条语句执行完后,都会自动更新 ( 如果需要 ) 上下文信息,如果要查看当前的上下文信息,可以随时调用 p IRB.CurrentContext
irb> p IRB.CurrentContext conf.ap_name="irb" conf.auto_indent_mode=true conf.back_trace_limit=3 conf.debug_level=0 conf.echo=true conf.ignore_eof=false conf.ignore_sigint=true ... irb>