模組 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 資訊的初始設定。
選項的詳細資料說明如下列相關小節中。
IRB 命令列選項的簡要清單可在說明訊息中看到,而如果您使用命令列選項 --help
,也會顯示此訊息。
如果您有興趣瞭解特定選項,請參閱索引。
命令列參數¶ ↑
命令列參數會傳遞到 IRB 中的陣列 ARGV
$ 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
傳回
-
true
,如果提供了選項--multiline
。 -
false
,如果提供了選項--nomultiline
。 -
nil
,如果兩者都沒有提供。
方法 conf.use_singleline?
及其同義詞 conf.use_readline
傳回
-
true
,如果提供了選項--singleline
。 -
false
,如果提供了選項--nosingleline
。 -
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 --help
以取得 RI 的詳細資料。
陣列 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] = 陣列
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] = 字串
設定預設初始值
IRB.conf[:IRB_NAME] = 'foo'
應用程式名稱¶ ↑
您可以為 IRB 會話指定應用程式名稱。
預設初始值為 'irb'
irb(main):001> conf.ap_name => "irb"
您可以透過雜湊項目 IRB.conf[:AP_NAME] = 字串
設定預設初始值
IRB.conf[:AP_NAME] = 'my_ap_name'
設定 Monitor
¶ ↑
您可以透過在設定檔中將程序指定給 IRB.conf[:IRB_RC]
來監控設定變更
IRB.conf[:IRB_RC] = proc {|conf| puts conf.class }
每次設定變更時,該程序會以引數 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]
設定程序,則會在執行該程序後呼叫,並以目前會話的內容作為其引數。每個會話都可以使用此機制設定。
會話變數¶ ↑
在每個 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