A.8.3.1. Spuštění/vyvolání irb z kódu

Irb je možno vyvolat i z běžícího kódu. Na začátek skriptu vložíme

require 'irb'

na místě v kódu, kde chceme vyvolat interaktivní sezení s irb vložímě příkaz

IRB::start $STDIN

chceme-li, aby po ukončení interaktivního sezení pokračovalo vykonávání programu ukončujeme irb příkazem quit

Dalším způsobem zaručení návratu do programu je ošetřit událost SystemExit, například takto

require 'irb'
puts "Before IRB"
begin
    IRB::start $STDIN
rescue SystemExit
end

puts "Okie donkey"

Takto spuštěný irb (irb) má ovšem omezené možnosti. Chceme-li zkoumat a měnit obsahy proměnných, musíme to udělat trochu jinak. Především budeme muset zasáhnout do modulu irb a dodefinovat si metodu start2 výsledný ukázkový příklad vypadá takto:

Příklad A.1. Start irb z programu

# $Id: invoke-irb.ses,v 1.1 2002/12/16 20:34:12 radek Exp $
sh: line 3: ./invoke-irb.rb: není souborem ani adresářem
sh: line 4: p: command not found
sh: line 5: a: command not found
sh: line 6: quit: command not found


Jednoduchá interakce s tímto programem pak může být třeba:

# $Id: invoke-irb.ses,v 1.1 2002/12/16 20:34:12 radek Exp $
sh: line 3: ./invoke-irb.rb: není souborem ani adresářem
sh: line 4: p: command not found
sh: line 5: a: command not found
sh: line 6: quit: command not found

Nobu Nakada mi poslal tento kousek kódu

require 'irb'
IRB.setup(nil)
irb = IRB::Irb.new(IRB::WorkSpace.new(binding))
IRB.conf[:MAIN_CONTEXT] = irb.context
a = 10
begin
    raise "#{a} left" if (a -= 1) > 0
rescue StandardError, ScriptError
    puts $!.to_s
    trap("SIGINT") {irb.signal_handle}
    catch(:IRB_EXIT) {irb.eval_input} or retry
end
Licence Creative Commons
Tento dokument Ruby, jehož autorem je Radek Hnilica, podléhá licenci Creative Commons Uveďte autora-Nevyužívejte dílo komerčně-Zachovejte licenci 3.0 Česká republika .