模組 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 資訊的初始設定。

選項的詳細資料說明如下列相關小節中。

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 程式碼,並且可以包含使用者程式碼,這些程式碼

設定檔的路徑為以下項目中找到的第一個:

如果搜尋失敗,則沒有設定檔。

如果搜尋成功,則設定檔會以 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 --help 以取得 RI 的詳細資料。

陣列 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] = 字串 設定預設初始值

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 呼叫

區域設定

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] 設定程序,則會在執行該程序後呼叫,並以目前會話的內容作為其引數。每個會話都可以使用此機制設定。

會話變數

在每個 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