IRB 模块

IRB

模块 IRB(“交互式 Ruby”)提供了一个类似于 shell 的界面,支持用户与 Ruby 解释器进行交互。

它作为一个读取-求值-打印循环 (REPL) 运行,它

示例

$ irb
irb(main):001> File.basename(Dir.pwd)
=> "irb"
irb(main):002> Dir.entries('.').size
=> 25
irb(main):003* Dir.entries('.').select do |entry|
irb(main):004*   entry.start_with?('R')
irb(main):005> end
=> ["README.md", "Rakefile"]

键入的输入还可能包括 IRB 特定的命令

如上所示,你可以使用 shell 命令 irb 启动 IRB。

你可以通过键入命令 exit 来停止 IRB 会话。

irb(main):006> exit
$

此时,IRB 会调用数组 IRB.conf[:AT_EXIT] 中找到的任何钩子,然后退出。

启动

在启动时,IRB

  1. 解释(作为 Ruby 代码)配置文件(如果给定)的内容。

  2. 哈希 IRB.conf 和默认值构建初始会话上下文;哈希内容可能受到命令行选项和配置文件中的直接赋值的影响。

  3. 将上下文分配给变量 conf

  4. 将命令行参数分配给变量 ARGV

  5. 打印 提示

  6. 初始化脚本的内容放入 IRB shell 中,就像用户键入命令一样。

命令行

在命令行上,所有选项都位于所有参数之前;未识别为选项的第一项将被视为参数,随后的所有项也是如此。

命令行选项

许多命令行选项都会影响哈希 IRB.conf 中的条目,而哈希 IRB.conf 又会影响 IRB 会话的初始配置。

选项的详细信息将在下面的相关小节中进行描述。

可以在帮助消息中看到 IRB 命令行选项的粗略列表,如果您使用命令行选项 --help,也会显示该列表。

如果您对某个特定选项感兴趣,请查阅索引。

命令行参数

命令行参数在数组 ARGV 中传递给 IRB

$ irb --noscript Foo Bar Baz
irb(main):001> ARGV
=> ["Foo", "Bar", "Baz"]
irb(main):002> exit
$

命令行选项 -- 会导致将随后的所有内容都视为参数,即使它们看起来像选项

$ irb --noscript -- --noscript -- Foo Bar Baz
irb(main):001> ARGV
=> ["--noscript", "--", "Foo", "Bar", "Baz"]
irb(main):002> exit
$

配置 File

您可以通过配置文件初始化 IRB。

如果给出了命令行选项 -f,则不会查找配置文件。

否则,如果配置文件可用,IRB 会读取并解释该配置文件。

配置文件可以包含任何 Ruby 代码,并且可以包含用户代码,这些代码

配置文件的路径是首先在以下位置找到的

如果搜索失败,则没有配置文件。

如果搜索成功,则配置文件将作为 Ruby 代码读取,因此可以包含您喜欢的任何 Ruby 编程。

如果读取了配置文件,则方法 conf.rc? 返回 true,否则返回 false。哈希条目 IRB.conf[:RC] 也包含该值。

哈希 IRB.conf

哈希 IRB.conf 中的初始条目由以下内容决定:

您可以通过键入 IRB.conf 查看哈希。

条目的含义的详细信息将在下面的相关小节中进行描述。

如果您对特定条目感兴趣,请查阅索引。

初始化优先级说明

初始化脚本

默认情况下,第一个命令行参数(在任何选项之后)是 Ruby 初始化脚本的路径。

IRB 读取初始化脚本并将它的内容放到 IRB shell 上,就像它是用户键入的命令一样。

命令行选项 --noscript 使第一个命令行参数被视为普通参数(而不是初始化脚本);--script 是默认值。

输入

本节介绍允许您更改 IRB 输入工作方式的功能;另请参见 输入和输出

输入命令历史记录

默认情况下,IRB 将多达 1000 个输入命令的历史记录存储在文件 ~/.irb_history 中(或者,如果找到 配置文件,则存储在该文件所在目录中的文件 .irb_history 中)。

如果历史文件不存在,则新建一个 IRB 会话,如果存在,则追加到该文件中。

可以通过向配置文件中添加以下内容来更改文件路径:IRB.conf[:HISTORY_FILE] = filepath,其中 filepath 是一个字符串文件路径。

在会话期间,方法 conf.history_file 返回文件路径,方法 conf.history_file = new_filepath 将历史记录复制到 new_filepath 处的文件,该文件成为会话的历史记录文件。

可以通过向配置文件中添加以下内容来更改保存的命令数:IRB.conf[:SAVE_HISTORY] = n,其中 n 是以下之一

在会话期间,可以使用方法 conf.save_historyconf.save_history= 来检索或更改计数。

命令别名

默认情况下,IRB 定义了几个命令别名

irb(main):001> conf.command_aliases
=> {:"$"=>:show_source, :"@"=>:whereami}

可以使用以下内容在配置文件中更改初始别名

IRB.conf[:COMMAND_ALIASES] = {foo: :show_source, bar: :whereami}

可以使用配置方法 conf.command_aliases= 随时替换当前别名;由于 conf.command_aliases 是一个哈希,因此可以对其进行修改。

文件结尾

默认情况下,IRB.conf[:IGNORE_EOF]false,这意味着键入文件结尾字符 Ctrl-D 会导致会话退出。

可以通过向配置文件中添加 IRB.conf[:IGNORE_EOF] = true 来反转该行为。

在会话期间,方法 conf.ignore_eof? 返回设置,方法 conf.ignore_eof = boolean 设置它。

SIGINT

默认情况下,IRB.conf[:IGNORE_SIGINT]true,这意味着键入中断字符 Ctrl-C 会导致会话退出。

可以通过向配置文件中添加 IRB.conf[:IGNORE_SIGING] = false 来反转该行为。

在会话期间,方法 conf.ignore_siging? 返回设置,方法 conf.ignore_sigint = boolean 设置它。

自动完成

默认情况下,IRB 启用 自动完成

您可以通过以下方法之一禁用它

如果启用自动完成,则方法 conf.use_autocomplete? 返回 true,否则返回 false

在会话期间可能无法更改设置。

自动缩进

默认情况下,IRB 自动缩进代码行以显示结构(例如,它缩进块的内容)。

当前设置由配置方法 conf.auto_indent_mode 返回。

默认初始设置是 true

irb(main):001> conf.auto_indent_mode
=> true
irb(main):002* Dir.entries('.').select do |entry|
irb(main):003*   entry.start_with?('R')
irb(main):004> end
=> ["README.md", "Rakefile"]

您可以使用以下方法在配置文件中更改初始设置

IRB.conf[:AUTO_INDENT] = false

请注意,当前设置可能无法在 IRB 会话中更改。

输入法

IRB 输入法确定如何读取命令输入;默认情况下,会话的输入法是 IRB::RelineInputMethod

您可以通过以下方法设置输入法

方法 conf.use_multiline? 及其同义词 conf.use_reline 返回

方法 conf.use_singleline? 及其同义词 conf.use_readline 返回

输出

本节描述了允许您更改 IRB 输出工作方式的功能;另请参见输入和输出

返回值打印(回显)

默认情况下,IRB 会打印(回显)所有输入命令返回的值。

您可以更改初始行为并通过以下方式禁止所有回显

在会话期间,您可以使用配置方法 conf.echo=(设置为 truefalse)更改当前设置。

如上所述,默认情况下,IRB 会打印所有输入命令返回的值;但 IRB 会对赋值语句返回的值提供特殊处理,这些值可能是

> “abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc…

您可以通过以下方式更改初始行为

在会话期间,您可以使用配置方法 conf.echo_on_assignment=(设置为 truefalse:truncate)更改当前设置。

默认情况下,IRB 通过调用方法 inspect 来格式化返回值。

您可以通过以下方式更改初始行为

在会话期间,你可以使用 conf.inspect_mode= 方法更改设置。

多行输出

默认情况下,IRB 会在多行响应前添加一个换行符。

你可以通过向配置文件中添加内容来更改初始默认值

IRB.conf[:NEWLINE_BEFORE_MULTILINE_OUTPUT] = false

在会话期间,你可以使用 conf.newline_before_multiline_output?conf.newline_before_multiline_output= 方法检索或设置值。

示例

irb(main):001> conf.inspect_mode = false
=> false
irb(main):002> "foo\nbar"
=>
foo
bar
irb(main):003> conf.newline_before_multiline_output = false
=> false
irb(main):004> "foo\nbar"
=> foo
bar

评估历史记录

默认情况下,IRB 不会保存评估历史记录(返回的值),并且相关方法 conf.eval_history___ 未定义。

你可以启用该历史记录,并设置要存储的评估的最大数量

如果 n 为零,则存储所有评估历史记录。

执行上述任一操作

提示和返回格式

默认情况下,IRB 使用其 :DEFAULT 提示模式中定义的提示和返回值格式。

默认提示和返回格式

默认提示和返回值如下所示

irb(main):001> 1 + 1
=> 2
irb(main):002> 2 + 2
=> 4

提示包括

默认提示实际上定义了三种格式

在键入以下字符时,您可以看到提示符发生变化

irb(main):001* Dir.entries('.').select do |entry|
irb(main):002*   entry.start_with?('R')
irb(main):003> end
=> ["README.md", "Rakefile"]

预定义提示符

IRB 有几个预定义提示符,存储在哈希 IRB.conf[:PROMPT]

irb(main):001> IRB.conf[:PROMPT].keys
=> [:NULL, :DEFAULT, :CLASSIC, :SIMPLE, :INF_RUBY, :XMP]

要查看这些提示符的完整数据,请键入 IRB.conf[:PROMPT]

这些提示符定义中的大多数都包含表示 IRB 名称、会话名称和行号等值的说明符;请参阅 提示符说明符

您可以通过以下方式更改初始提示符和返回格式

您可以使用以下方法检索或设置当前提示符模式

conf.prompt_modeconf.prompt_mode=

如果您对提示符和返回格式(而非默认值)感兴趣,可以尝试其他提示符和返回格式。

自定义提示符

您还可以定义自定义提示符和返回格式,可以在 IRB 会话或配置文件中进行此操作。

如上所述,IRB 中的提示符实际上定义了三个提示符。对于简单的自定义数据,我们将全部设为相同

irb(main):001* IRB.conf[:PROMPT][:MY_PROMPT] = {
irb(main):002*   PROMPT_I: ': ',
irb(main):003*   PROMPT_C: ': ',
irb(main):004*   PROMPT_S: ': ',
irb(main):005*   RETURN: '=> '
irb(main):006> }
=> {:PROMPT_I=>": ", :PROMPT_C=>": ", :PROMPT_S=>": ", :RETURN=>"=> "}

如果您在配置文件中定义了自定义提示符,还可以通过添加以下内容使其成为当前提示符

IRB.conf[:PROMPT_MODE] = :MY_PROMPT

无论在何处定义,您都可以在会话中将其设为当前提示符

conf.prompt_mode = :MY_PROMPT

您可以使用各种配置方法查看或修改当前提示符数据

提示符说明符

提示符的定义可以包含某些值被替换的说明符

详细程度

默认情况下,IRB 详细程度被禁用,这意味着输出较小而不是较大。

你可以通过以下方式启用详细程度

在会话期间,你可以使用 conf.verboseconf.verbose= 方法检索或设置详细程度。

帮助

命令行选项 --version 会导致 IRB 打印其帮助文本并退出。

版本

命令行选项 --version 会导致 IRB 打印其版本文本并退出。

输入和输出

颜色高亮

默认情况下,IRB 颜色高亮处于启用状态,并且用于以下两者

你可以通过以下方式禁用颜色高亮

调试

命令行选项 -d 将变量 $VERBOSE$DEBUG 设置为 true;这些对 IRB 输出没有影响。

警告

命令行选项 -w 禁止警告。

命令行选项 <tt>-W[level]<tt> 设置警告级别;0=静默,1=中等,2=详细。

性能测量

IRB.conf IRB.conf IRB.conf

其他功能

加载模块

您可以指定要在启动时加载的模块名称。

数组 conf.load_modules 确定在会话启动期间要加载的模块(如果有)。该数组仅在会话启动期间使用,因此初始值是唯一重要的值。

默认初始值为 [](不加载模块)

irb(main):001> conf.load_modules
=> []

您可以通过以下方式设置默认初始值

请注意,配置文件条目会覆盖命令行选项。

RI 文档目录

您可以指定要在启动时加载的 RI 文档目录的路径(除了默认目录之外);有关 RI 的详细信息,请键入 ri --help

数组 conf.extra_doc_dirs 确定在会话启动期间要加载的目录(如果有)。该数组仅在会话启动期间使用,因此初始值是唯一重要的值。

默认初始值为 [](不加载额外文档)

irb(main):001> conf.extra_doc_dirs
=> []

您可以通过以下方式设置默认初始值

请注意,配置文件条目会覆盖命令行选项。

上下文模式

IRB.conf

IRB 名称

您可以为 IRB 指定一个名称。

默认初始值为 'irb'

irb(main):001> conf.irb_name
=> "irb"

您可以通过哈希条目 IRB.conf[:IRB_NAME] = string 设置默认初始值

IRB.conf[:IRB_NAME] = 'foo'

应用程序名称

您可以为 IRB 会话指定一个应用程序名称。

默认初始值为 'irb'

irb(main):001> conf.ap_name
=> "irb"

您可以通过哈希项 IRB.conf[:AP_NAME] = string 设置默认初始值

IRB.conf[:AP_NAME] = 'my_ap_name'

配置 Monitor

您可以通过在配置文件中将 proc 分配给 IRB.conf[:IRB_RC] 来监视配置更改

IRB.conf[:IRB_RC] = proc {|conf| puts conf.class }

每次更改配置时,都会使用参数 conf 调用该 proc

语言环境

IRB.conf

编码

命令行选项 -E ex[:in] 设置初始外部 (ex) 和内部 (in) 编码。

命令行选项 -U 将两者都设置为 UTF-8。

命令

请使用“show_cmds` 命令查看可用命令列表。

IRB 会话

IRB 具有一个特殊功能,允许您一次管理多个会话。

您可以使用 Irb.irb 创建新会话,并使用提示符中的 jobs 命令获取当前会话列表。

配置

命令行选项或 IRB.conf 指定 Irb.irb 的默认行为。

另一方面,IRB 中的命令行选项 中的每个 conf 用于单独配置 IRB.irb

如果为 IRB.conf[:IRB_RC] 设置了 proc,则在执行该 proc 之后,会以当前会话的上下文作为其参数调用它。可以使用此机制配置每个会话。

会话变量

在每个 Irb 会话中有一些变量可能派得上用场

_

作为局部变量执行的值命令

__

已评估命令的历史记录。仅当 IRB.conf[:EVAL_HISTORY] 不为 nil(这是默认值)时才可用。另请参见 IRB::Context#eval_history= 和 IRB::History。

__[line_no]

返回给定行号 line_no 处的评估值。如果 line_no 为负数,则返回值在最近的返回值之前 line_no 行。

限制

输入到 IRB 中的 Ruby 代码的行为与文件中的 Ruby 代码相同,但

nop.rb -

by Keiju ISHITSUKA(keiju@ruby-lang.org)

irb/multi-irb.rb - 多个 irb 模块

by Keiju ISHITSUKA(keiju@ruby-lang.org)

frame.rb -

by Keiju ISHITSUKA(Nihon Rational Software Co.,Ltd)

irb/help.rb - 打印用法模块

by Keiju ISHITSUKA(keiju@ishitsuka.com)

irb/lc/error.rb -

by Keiju ISHITSUKA(keiju@ruby-lang.org)

irb/lc/ja/error.rb -

by Keiju ISHITSUKA(keiju@ruby-lang.org)

output-method.rb - irb 使用的输出方法

by Keiju ISHITSUKA(keiju@ruby-lang.org)

常量

TOPLEVEL_BINDING

公共类方法

CurrentContext() 单击以切换源代码

会话的当前 IRB::Context,请参阅 IRB.conf

irb
irb(main):001:0> IRB.CurrentContext.irb_name = "foo"
foo(main):002:0> IRB.conf[:MAIN_CONTEXT].irb_name #=> "foo"
# File lib/irb.rb, line 887
def IRB.CurrentContext
  IRB.conf[:MAIN_CONTEXT]
end
JobManager() 单击以切换源代码

会话中的当前 JobManager

# File lib/irb/ext/multi-irb.rb, line 169
def IRB.JobManager
  @JobManager
end
initialize_tracer() 单击以切换源代码

初始化跟踪功能

# File lib/irb/ext/tracer.rb, line 24
def IRB.initialize_tracer
  Tracer.verbose = false
  Tracer.add_filter {
    |event, file, line, id, binding, *rests|
    /^#{Regexp.quote(@CONF[:IRB_LIB_PATH])}/ !~ file and
      File::basename(file) != "irb.rb"
  }
end
irb(file = nil, *main) 单击以切换源代码

创建新的 IRB 会话,请参阅 Irb.new

可选的 file 参数会与使用剩余参数创建的工作空间一起传递给 Context.new,请参阅 WorkSpace.new

# File lib/irb/ext/multi-irb.rb, line 182
def IRB.irb(file = nil, *main)
  workspace = WorkSpace.new(*main)
  parent_thread = Thread.current
  Thread.start do
    begin
      irb = Irb.new(workspace, file)
    rescue
      print "Subirb can't start with context(self): ", workspace.main.inspect, "\n"
      print "return to main irb\n"
      Thread.pass
      Thread.main.wakeup
      Thread.exit
    end
    @CONF[:IRB_RC].call(irb.context) if @CONF[:IRB_RC]
    @JobManager.insert(irb)
    @JobManager.current_job = irb
    begin
      system_exit = false
      catch(:IRB_EXIT) do
        irb.eval_input
      end
    rescue SystemExit
      system_exit = true
      raise
      #fail
    ensure
      unless system_exit
        @JobManager.delete(irb)
        if @JobManager.current_job == irb
          if parent_thread.alive?
            @JobManager.current_job = @JobManager.irb(parent_thread)
            parent_thread.run
          else
            @JobManager.current_job = @JobManager.main_irb
            @JobManager.main_thread.run
          end
        end
      end
    end
  end
  Thread.stop
  @JobManager.current_job = @JobManager.irb(Thread.current)
end
irb_abort(irb, exception = Abort) 单击以切换源代码

中止然后中断 irb。

将引发 Abort 异常或给定的 exception

# File lib/irb.rb, line 914
def IRB.irb_abort(irb, exception = Abort)
  irb.context.thread.raise exception, "abort then interrupt!"
end
irb_exit(irb, ret) 单击以切换源代码

退出 irb

# File lib/irb.rb, line 907
def IRB.irb_exit(irb, ret)
  throw :IRB_EXIT, ret
end
print_usage() 单击以切换源代码

输出 irb 帮助消息,请参阅 IRB 中的命令行选项

start(ap_path = nil) 单击以切换源代码

初始化 IRB,并在 TOPLEVEL_BINDING 创建新的 Irb.irb 对象

# File lib/irb.rb, line 892
def IRB.start(ap_path = nil)
  STDOUT.sync = true
  $0 = File::basename(ap_path, ".rb") if ap_path

  IRB.setup(ap_path)

  if @CONF[:SCRIPT]
    irb = Irb.new(nil, @CONF[:SCRIPT])
  else
    irb = Irb.new
  end
  irb.run(@CONF)
end

私有类方法

easter_egg(type = nil) 单击以切换源代码
# File lib/irb/easter-egg.rb, line 109
        def easter_egg(type = nil)
  type ||= [:logo, :dancing].sample
  case type
  when :logo
    require "rdoc"
    RDoc::RI::Driver.new.page do |io|
      io.write easter_egg_logo(:large)
    end
  when :dancing
    STDOUT.cooked do
      interrupted = false
      prev_trap = trap("SIGINT") { interrupted = true }
      canvas = Canvas.new(Reline.get_screen_size)
      Reline::IOGate.set_winch_handler do
        canvas = Canvas.new(Reline.get_screen_size)
      end
      ruby_model = RubyModel.new
      print "\e[?1049h"
      0.step do |i| # TODO (0..).each needs Ruby 2.6 or later
        buff = canvas.draw do
          ruby_model.render_frame(i) do |p1, p2|
            canvas.line(p1, p2)
          end
        end
        buff[0, 20] = "\e[0mPress Ctrl+C to stop\e[31m\e[1m"
        print "\e[H" + buff
        sleep 0.05
        break if interrupted
      end
    rescue Interrupt
    ensure
      print "\e[0m\e[?1049l"
      trap("SIGINT", prev_trap)
    end
  end
end