IRB 模块
IRB¶ ↑
模块 IRB(“交互式 Ruby”)提供了一个类似于 shell 的界面,支持用户与 Ruby 解释器进行交互。
它作为一个读取-求值-打印循环 (REPL) 运行,它
-
读取你在键入时输入的每个字符。你可以修改 IRB 上下文来更改输入的工作方式。请参阅 输入。
-
求值每次读取到语法完整的段落时都会求值代码。
-
打印在求值后打印。你可以修改 IRB 上下文来更改输出的工作方式。请参阅 输出。
示例
$ 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
-
解释(作为 Ruby 代码)配置文件(如果给定)的内容。
-
从 哈希 IRB.conf 和默认值构建初始会话上下文;哈希内容可能受到命令行选项和配置文件中的直接赋值的影响。
-
将上下文分配给变量
conf
。 -
将命令行参数分配给变量
ARGV
。 -
打印 提示。
-
将初始化脚本的内容放入 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 代码,并且可以包含用户代码,这些代码
-
然后可以在 IRB 中进行调试。
-
配置 IRB 本身。
-
需要或加载文件。
配置文件的路径是首先在以下位置找到的
-
变量
$IRBRC
的值(如果已定义)。 -
变量
$XDG_CONFIG_HOME/irb/irbrc
的值(如果已定义)。 -
File
$HOME/.irbrc
(如果存在)。 -
File
$HOME/.config/irb/irbrc
(如果存在)。 -
File
.config/irb/irbrc
(如果存在,则在当前目录中)。 -
File
.irbrc
(如果存在,则在当前目录中)。 -
File
irb.rc
(如果存在,则在当前目录中)。 -
File
_irbrc
(如果存在,则在当前目录中)。 -
File
$irbrc
(如果存在,则在当前目录中)。
如果搜索失败,则没有配置文件。
如果搜索成功,则配置文件将作为 Ruby 代码读取,因此可以包含您喜欢的任何 Ruby 编程。
如果读取了配置文件,则方法 conf.rc?
返回 true
,否则返回 false
。哈希条目 IRB.conf[:RC]
也包含该值。
哈希 IRB.conf
¶ ↑
哈希 IRB.conf
中的初始条目由以下内容决定:
-
默认值。
-
命令行选项,可以覆盖默认值。
-
配置文件中的直接赋值。
您可以通过键入 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 是以下之一
-
正整数:要保存的命令数,
-
零:要保存所有命令。
-
nil
:不保存任何命令,。
在会话期间,可以使用方法 conf.save_history
或 conf.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 启用 自动完成
您可以通过以下方法之一禁用它
-
将
IRB.conf[:USE_AUTOCOMPLETE] = false
添加到配置文件中。 -
给出命令行选项
--noautocomplete
(--autocomplete
是默认值)。
如果启用自动完成,则方法 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
。
您可以通过以下方法设置输入法
-
添加到配置文件
-
IRB.conf[:USE_SINGLELINE] = true
或IRB.conf[:USE_MULTILINE]= false
将输入法设置为IRB::ReadlineInputMethod
。 -
IRB.conf[:USE_SINGLELINE] = false
或IRB.conf[:USE_MULTILINE] = true
将输入法设置为IRB::RelineInputMethod
。
-
-
给出命令行选项
-
--singleline
或--nomultiline
将输入法设置为IRB::ReadlineInputMethod
。 -
--nosingleline
或 <tt>–multiline/tt> 将输入法设置为IRB::RelineInputMethod
。
-
方法 conf.use_multiline?
及其同义词 conf.use_reline
返回
-
如果给出了选项
--multiline
,则返回true
。 -
如果给出了选项
--nomultiline
,则返回false
。 -
如果没有给出,则返回
nil
。
方法 conf.use_singleline?
及其同义词 conf.use_readline
返回
-
如果给出了选项
--singleline
,则返回true
。 -
如果给出了选项
--nosingleline
,则返回false
。 -
如果没有给出,则返回
nil
。
输出¶ ↑
本节描述了允许您更改 IRB 输出工作方式的功能;另请参见输入和输出。
返回值打印(回显)¶ ↑
默认情况下,IRB 会打印(回显)所有输入命令返回的值。
您可以更改初始行为并通过以下方式禁止所有回显
-
添加到配置文件中:
IRB.conf[:ECHO] = false
。(此项的默认值为niL
,其含义与true
相同。) -
提供命令行选项
--noecho
。(默认值为--echo
。)
在会话期间,您可以使用配置方法 conf.echo=
(设置为 true
或 false
)更改当前设置。
如上所述,默认情况下,IRB 会打印所有输入命令返回的值;但 IRB 会对赋值语句返回的值提供特殊处理,这些值可能是
-
以截断形式打印(以适应单行输出),这是默认值;后缀为省略号(
...
),以表示截断)irb(main):001> x = 'abc' * 100
> “abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc…¶ ↑
-
以完整形式打印(无论长度如何)。
-
禁止打印(根本不打印)
您可以通过以下方式更改初始行为
-
添加到配置文件中:
IRB.conf[:ECHO_ON_ASSIGNMENT] = false
。(此项的默认值为niL
,其含义与:truncate
相同。) -
提供命令行选项
--noecho-on-assignment
或--echo-on-assignment
。(默认值为--truncate-echo-on-assigment
。)
在会话期间,您可以使用配置方法 conf.echo_on_assignment=
(设置为 true
、false
或 :truncate
)更改当前设置。
默认情况下,IRB 通过调用方法 inspect
来格式化返回值。
您可以通过以下方式更改初始行为
-
添加到配置文件中:
IRB.conf[:INSPECT_MODE] = false
。(此项的默认值为true
。) -
提供命令行选项
--noinspect
。(默认值为--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
、_
和 __
未定义。
你可以启用该历史记录,并设置要存储的评估的最大数量
-
在配置文件中:添加
IRB.conf[:EVAL_HISTORY] = n
。(以下示例假定我们已添加IRB.conf[:EVAL_HISTORY] = 5
。) -
在会话中(任何时候):
conf.eval_history = n
。
如果 n
为零,则存储所有评估历史记录。
执行上述任一操作
-
设置评估历史记录的最大大小;定义方法
conf.eval_history
,它返回评估历史记录的最大大小n
irb(main):001> conf.eval_history = 5 => 5 irb(main):002> conf.eval_history => 5
-
定义变量
_
,它包含最近的评估,如果没有则为nil
;与方法conf.last_value
相同irb(main):003> _ => 5 irb(main):004> :foo => :foo irb(main):005> :bar => :bar irb(main):006> _ => :bar irb(main):007> _ => :bar
-
定义变量
__
-
__
无装饰:包含所有评估历史记录irb(main):008> :foo => :foo irb(main):009> :bar => :bar irb(main):010> :baz => :baz irb(main):011> :bat => :bat irb(main):012> :bam => :bam irb(main):013> __ => 9 :bar 10 :baz 11 :bat 12 :bam irb(main):014> __ => 10 :baz 11 :bat 12 :bam 13 ...self-history...
请注意,当评估为多行时,它的显示方式不同。
-
__[
m]
-
正数 m:包含给定行号的评估,如果该行号不在评估历史记录中,则为
nil
irb(main):015> __[12] => :bam irb(main):016> __[1] => nil
-
负数 m:包含第
mth
个评估(从末尾开始),如果该评估不在评估历史记录中,则为nil
irb(main):017> __[-3] => :bam irb(main):018> __[-13] => nil
-
零 m:包含
nil
irb(main):019> __[0] => nil
-
-
提示和返回格式¶ ↑
默认情况下,IRB 使用其 :DEFAULT
提示模式中定义的提示和返回值格式。
默认提示和返回格式¶ ↑
默认提示和返回值如下所示
irb(main):001> 1 + 1 => 2 irb(main):002> 2 + 2 => 4
提示包括
默认提示实际上定义了三种格式
-
适用于大多数情况(如上)
irb(main):003> Dir => Dir
-
适用于输入命令为语句续行时(添加尾随星号)
irb(main):004* Dir.
-
适用于输入命令为字符串续行时(添加尾随单引号)
irb(main):005' Dir.entries('.
在键入以下字符时,您可以看到提示符发生变化
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 名称、会话名称和行号等值的说明符;请参阅 提示符说明符。
您可以通过以下方式更改初始提示符和返回格式
-
添加到配置文件中:
IRB.conf[:PROMPT] = mode
,其中 mode 是提示符模式的符号名称。 -
提供命令行选项
-
--prompt mode
:将提示符模式设置为 mode。其中 mode 是提示符模式的符号名称。 -
--simple-prompt
或--sample-book-mode
:将提示符模式设置为:SIMPLE
。 -
--inf-ruby-mode
:将提示符模式设置为:INF_RUBY
,并抑制--multiline
和--singleline
。 -
--noprompt
:抑制提示;不影响回显。
-
您可以使用以下方法检索或设置当前提示符模式
conf.prompt_mode
和 conf.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
您可以使用各种配置方法查看或修改当前提示符数据
-
conf.prompt_mode
、conf.prompt_mode=
。 -
conf.prompt_c
、conf.c=
。 -
conf.prompt_i
、conf.i=
。 -
conf.prompt_s
,conf.s=
。 -
conf.return_format
,return_format=
。
提示符说明符¶ ↑
提示符的定义可以包含某些值被替换的说明符
-
%N
:正在运行的程序的名称。 -
%m
:self.to_s
的值。 -
%M
:self.inspect
的值。 -
%l
:字符串类型的指示;"
、'
、/
、]
之一。 -
NNi
:缩进级别。 -
NNn
:行号。 -
%%
:文字%
。
详细程度¶ ↑
默认情况下,IRB 详细程度被禁用,这意味着输出较小而不是较大。
你可以通过以下方式启用详细程度
-
添加到配置文件中:
IRB.conf[:VERBOSE] = true
(默认值为nil
)。 -
给出命令行选项
--verbose
(默认值为--noverbose
)。
在会话期间,你可以使用 conf.verbose
和 conf.verbose=
方法检索或设置详细程度。
帮助¶ ↑
命令行选项 --version
会导致 IRB 打印其帮助文本并退出。
版本¶ ↑
命令行选项 --version
会导致 IRB 打印其版本文本并退出。
输入和输出¶ ↑
颜色高亮¶ ↑
默认情况下,IRB 颜色高亮处于启用状态,并且用于以下两者
-
输入:在你键入时,IRB 会读取键入的字符并高亮它识别的元素;它还会高亮错误,例如括号不匹配。
-
输出:IRB 高亮语法元素。
你可以通过以下方式禁用颜色高亮
-
添加到配置文件中:
IRB.conf[:USE_COLORIZE] = false
(默认值为true
)。 -
给出命令行选项
--nocolorize
调试¶ ↑
命令行选项 -d
将变量 $VERBOSE
和 $DEBUG
设置为 true
;这些对 IRB 输出没有影响。
警告¶ ↑
命令行选项 -w
禁止警告。
命令行选项 <tt>-W[level]<tt> 设置警告级别;0=静默,1=中等,2=详细。
性能测量¶ ↑
其他功能¶ ↑
加载模块¶ ↑
您可以指定要在启动时加载的模块名称。
数组 conf.load_modules
确定在会话启动期间要加载的模块(如果有)。该数组仅在会话启动期间使用,因此初始值是唯一重要的值。
默认初始值为 []
(不加载模块)
irb(main):001> conf.load_modules => []
您可以通过以下方式设置默认初始值
-
命令行选项
-r
$ irb -r csv -r json irb(main):001> conf.load_modules => ["csv", "json"]
-
哈希条目
IRB.conf[:LOAD_MODULES] = array
IRB.conf[:LOAD_MODULES] = %w[csv, json]
请注意,配置文件条目会覆盖命令行选项。
RI 文档目录¶ ↑
您可以指定要在启动时加载的 RI 文档目录的路径(除了默认目录之外);有关 RI 的详细信息,请键入 ri --help
。
数组 conf.extra_doc_dirs
确定在会话启动期间要加载的目录(如果有)。该数组仅在会话启动期间使用,因此初始值是唯一重要的值。
默认初始值为 []
(不加载额外文档)
irb(main):001> conf.extra_doc_dirs => []
您可以通过以下方式设置默认初始值
-
命令行选项
--extra_doc_dir
$ irb --extra-doc-dir your_doc_dir --extra-doc-dir my_doc_dir irb(main):001> conf.extra_doc_dirs => ["your_doc_dir", "my_doc_dir"]
-
哈希条目
IRB.conf[:EXTRA_DOC_DIRS] = array
IRB.conf[:EXTRA_DOC_DIRS] = %w[your_doc_dir my_doc_dir]
请注意,配置文件条目会覆盖命令行选项。
上下文模式¶ ↑
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
语言环境¶ ↑
编码¶ ↑
命令行选项 -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 代码相同,但
-
由于 IRB 在语法完整后立即评估输入,因此某些结果可能略有不同。
-
分叉可能不会表现良好。
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
公共类方法
会话的当前 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
# File lib/irb/ext/multi-irb.rb, line 169 def IRB.JobManager @JobManager end
初始化跟踪功能
# 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
可选的 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
异常或给定的 exception
。
# File lib/irb.rb, line 914 def IRB.irb_abort(irb, exception = Abort) irb.context.thread.raise exception, "abort then interrupt!" end
退出 irb
# File lib/irb.rb, line 907 def IRB.irb_exit(irb, ret) throw :IRB_EXIT, ret end
输出 irb 帮助消息,请参阅 IRB
中的命令行选项。
# File lib/irb/help.rb, line 9 def IRB.print_usage lc = IRB.conf[:LC_MESSAGES] path = lc.find("irb/help-message") space_line = false File.open(path){|f| f.each_line do |l| if /^\s*$/ =~ l lc.puts l unless space_line space_line = true next end space_line = false l.sub!(/#.*$/, "") next if /^\s*$/ =~ l lc.puts l end } end
初始化 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
私有类方法
# 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
# File lib/irb/easter-egg.rb, line 101 def easter_egg_logo(type) @easter_egg_logos ||= File.read(File.join(__dir__, 'ruby_logo.aa'), encoding: 'UTF-8:UTF-8') .split(/TYPE: ([A-Z]+)\n/)[1..] .each_slice(2) .to_h @easter_egg_logos[type.to_s.upcase] end