Ruby IRB 的两个小技巧

yufei       6 年, 3 月 前       1393

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>
目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.