Programmering i Ruby

Den Pragmatiske Programmerers Veiledning

Forrige < Innhold ^
Neste >

Interaktivt Ruby Skall



På side 124 introduserte vi irb, en Ruby-modul som lar deg kjøre Ruby-programmer interaktivt, og se resultatene øyeblikkelig. Dette vedlegget går inn på mer detaljer på bruk og tilpassing av irb.

Kommando-linjen

irb kjøres fra kommando-linjen.

irb [
            irb-options
            ] [
            ruby_script
            ] [
            options
            ]

Kommando-linje-opsjonene for irb er listet i tabell B.1 på side 518. Vanligvis vil du kjøre irb uten opsjoner, men hvis du vil kjøre et skript, og se en nøye beskrivelse mens det kjører, kan du skrive navnet til Ruby-skriptet med hvilket som helst opsjoner for det skriptet.
irb kommando-linje-opsjoner
Opsjon Beskrivelse
-f Undertrykke lesing ~/.irbrc.
-m Matematikk-modus(fraksjon og matrise-støtte er tilgjengelig.
-d Sett $DEBUG til sann (samme som ``ruby -d'').
-r load-module Samme som ``ruby -r''.
--inspect Bruk ``inspect'' for output (standard, hvis ikke i matematikk-modus).
--noinspect Ikke bruk inspect for output.
--readline Bruk Readline-ekstensjons-modul.
--noreadline Ikke brukReadline ekstensjons-modul.
--prompt prompt-mode Bytt kall-modus. Predefinerte kall-modus er: ``default'', ``simple'', ``xmp'', and ``inf-ruby''.
--prompt-mode prompt-mode Samme som --prompt.
--inf-ruby-mode Setter opp irb til å kjøre iinf-ruby-mode i Emacs. Forandrer kallet og undertrykker --readline.
--simple-prompt Enkel kall-modus.
--noprompt Do not display a prompt.
--tracer Vis sporing for eksekutering av kommandoer.
--back-trace-limit n Vis tilbake-sporingsinformasjon ved å bruke topp n og siste n innlegginger. Standard-verdi er 16.
--irb_debug n Sett internt debug-nivå til n(bare for irb-utvikling).
-v, --version Skriv ut versjon av irb

Initialiserings-fil

irb bruker en initialiserings-fil hvor du kan sett vanlige bruke opsjoner eller eksekutere noen påkrevde Ruby-utsagn. Når irb blir kjørt vil den prøve å laste inn initialiserings-filen fra noen av de følgende kildene i rekkefølge: ~/.irbrc, .irbrc, irb.rc, _irbrc, and $irbrc.

I initialiserings-filen kan du kjøre hvillken som helst Ruby-kode. Du kan også sette hvilken som helst av konfigurasjons-verdiene som korresponderer til kommando-linje-argumentene som er vist i tabell B.2 på side 518.
irb konfigurasjons-verdier

IRB.conf[:IRB_NAME] = "irb" IRB.conf[:MATH_MODE] = false
IRB.conf[:USE_TRACER] = false IRB.conf[:USE_LOADER] = false
IRB.conf[:IGNORE_SIGINT] = true IRB.conf[:IGNORE_EOF] = false
IRB.conf[:INSPECT_MODE] = nil IRB.conf[:IRB_RC] = nil
IRB.conf[:BACK_TRACE_LIMIT] = 16 IRB.conf[:USE_LOADER] = false
IRB.conf[:USE_READLINE] = nil IRB.conf[:USE_TRACER] = false
IRB.conf[:IGNORE_SIGINT] = true IRB.conf[:IGNORE_EOF] = false
IRB.conf[:PROMPT_MODE] = :DEFAULT IRB.conf[:PROMPT] = { ... }
IRB.conf[:DEBUG_LEVEL] = 0 IRB.conf[:VERBOSE] = true

En interssant vri på å konfigurere irb er at du kan sette IRB.conf[:IRB_RC] til et Proc-objekt. Denne proc vil bli påkallet hver gang irb-konteksten blir forandret, og vil ta imot den nye konteksten som en parameter. Du kan bruke denne fasiliteten for å forandre konfigurasjonen dynamisk basert på kontekst.

Kommandoer

På irb-kallet kan du skrive hvilket som helst gyldig Ruby-uttrykk og se resultatene. Du kan også bruke hvilke som helst av de følgende kommandoene for å kontrollere irb-sesjonen.

exit, quit, irb_exit
Avslutter denne irb-sesjonen eller sub-sesjonen. Hvis du brukte cb for å endre bindinger (se nedenfor), avslutter denne bindings-modusen.

conf, irb_context
Viser nåværende konfigurasjon. Modifiserer konfigurasjonen oppnådd ved å kalle på metoder til conf.

conf.back_trace_limit n
Setter visning av tilbakesporings-linjer til top n og tail n. Standard verdi er 16.

conf.debug_level = N
Setter debug-nivået til irb.

conf.ignore_eof = true/false
Spesifiserer oppførselen til slutten på en fil som er mottatt som input. Hvis true, vil den bli ignorert, ellers vil den avslutte irb.

conf.ignore_sigint= true/false
Spesifiserer oppførelsen til ^C (control-c). Hvis false, vil ^C avslutte irb. Hvis sann vil ^C under input avslutte denne og returnere til topp-nivået under eksekuteringen, ^C vil abortere den pågående operasjonen.

conf.inf_ruby_mode = true/false
Hvis true, forandrer kallet og kutter readline support, og tillater irb å jobbe med inf-ruby-mode. [inf-ruby-modetillater Emacs brukere å interagere med Ruby mens de editerer programmer. Se fileninf_ruby.el i misckatalogen til distribusjonen for flere detaljer.] Standard-verdien er false.

conf.inspect_mode = true/false/nil
Spesifiserer inspect mode ifølge disse verdiene:

true Display inspect (default).
false Display to_s.
nil Inspect mode i non-math modus, non-inspect mode i math modus.

conf.irb_level
Viser det nåværende bindings-nivået(se cb).

conf.math_mode
Viser om Ruby er eller ikke er i matematikk-modus.

conf.use_loader = true/false
Spesifiserer om irbs egen fil-leser-metode blir benyttet med load/require.

conf.prompt_c
Kallet for et kontinuerlig utsagn (f,eks., rett etter en ``if'').

conf.prompt_i
Standard, topp-nivå kall.

conf.prompt_s
Kallet for en kontiuerlig streng.

conf.rc = true/false
Spesifiserer om initisialiserings-filen skal benyttes. ~/.irbrc.

conf.use_prompt = true/false
Spesfiserer om kall skal vises.

conf.use_readline = true/false/nil
Spesifiserer om Readline skal brukes eller ikke med følgende verdier:

true Bruk Readline.
false Ikke bruk Readline.
nil Bruk Readline med unntak for inf-ruby-mode (default).

conf.verbose=true/false
Spesifiserer om verbøse meldinger skal vises.

cb, irb_change_binding [ obj ]
Lager og entrer en ny binding som har sitt eget scope for lokale variable. Hvisobj er giit, vil det bli benyttet som self i den nye bindingen.

irb [obj]
Starter en irb subsesjon. Hvisobj er gitt, vil det bli benyttet som self.

jobs, irb_jobs
Lister irb subsesjoner.

fg n, irb_fg n
Svitsjer til spesifisert irb subsesjon. n kan være en av disse verdiene:

irb-subsesjon nummer
tråd-id
irb-objekt
self (objet som satte igang en spesifikk subsesjon.

kill n, irb_kill n
Dreper en irb subsesjon. n kan være en av verdiene beskrevet for irb_fg.

Konfigurering av kallet

Du har masse fleksibilitet i konfigurasjon av kallene som irb bruker. Sett av kall er lagret i kall-hashen:

IRB.conf[:PROMPT]

F.eks., for å etablere en ny kall-modus kalt "MY_PROMPT" kan du entre det følgende(enten direkte som et irb-kall eller i .irbrc filen):

IRB.conf[:PROMPT][:MY_PROMPT] = { # name of prompt mode
  :PROMPT_I => "...",             # normal prompt
  :PROMPT_S => "...",             # prompt for continuing strings
  :PROMPT_C => "...",             # prompt for continuing statement
  :RETURN => "    ==>%s\n"        # format to return value
}

Så, sett igang irb med kall-modusen ovenfor ved å

% irb --kall mitt-kall

Eller sett den følgende konfigurasjons-verdien:

IRB.conf[:PROMPT_MODE] = :MY_PROMPT

Konstantene PROMPT_I, PROMPT_S, og PROMPT_C spesifierer formatet på hvert av kall-strengene. Innen kall-formatet er de følgende flaggen tilgjengelige, og vil ekspandere til den gitte teksten

Flagg Beskrivelse
%N Nåværende kommando
%m to_s til hoved-objektet (self).
%M inspect til hoved-objektet (self).
%l Avgrensnings-type. I strenger som er fortsatt utover et linje-brekk %l vil vise type avgrensen som benyttes for å begynne strengen så du vil vite hvordan du skal ende den. Avgrenseren vil være en av ", ', /, ], eller `.
%ni Innrykks-nivå. Det valgfri nummeret n blir brukt som en bredde-spesifikasjon for printf, somprintf("%nd").
%nn Nåværende linje-nummer(n brukt som innrykks-nivå).
%% Et bokstavelig prosent-tegn.

For eksempel er standard-kallet definert som følgende:

IRB.conf[:PROMPT_MODE][:DEFAULT] = {
      :PROMPT_I => "%N(%m):%03n:%i> ",
      :PROMPT_S => "%N(%m):%03n:%i%l ",
      :PROMPT_C => "%N(%m):%03n:%i* ",
      :RETURN => "%s\n"
}

Begrensninger

P.g.a. måten irb virker er det en mindre inkompatibilitet mellom den og den standard Ruby-tolkeren. Problemet ligger i determineringen av lokale variable.

Normal ser Ruby for et tildelings-utsagn for å determinere om noe er en variabel---hvis et navn ikke har fått en tildeligen, så forutsetter Ruby at det er et metode-kall.

eval "a = 0"
a
produces:
prog.rb:2: undefined local variable or method `a'
for #<Object:0x401c0ce0> (NameError)

I dette tilfellet er tildelingen der, men den er inne i en streng, så Ruby tar det ikke med i betraktning.

irb, på den andre siden, eksekuterer utsagn mens de blir lagt inn.

  irb(main):001:0> eval "a = 0"
  0
  irb(main):002:0> a
  0

I irb ble tildelingen eksekutert før den andre linjen ble møtt, så "a" er korrekt identifisert som en lokal variabel.

Hvis du trenger å matche Ruby-oppførselen nærmere, kan du sette disse utsagnene innen et begin/end-par.

  irb(main):001:0> begin
  irb(main):002:1*   eval "a = 0"
  irb(main):003:1>   a
  irb(main):004:1> end
  NameError: undefined local variable or method `a'
  (irb):3:in `irb_binding'

rtags, xmp, and the Frame Class

Basis-versjonen av irb er installert med Ruby selv. Men det er en utvidet versjon av irb i arkivene som inneholder et par ekstra godbiter som er verdt å nevne.

rtags

rtags er en kommand som lager en TAGS-fil for bruk med enten emacs eller vi-editoren.

rtags [
            -vi
            ] [
            filer
            ]...

Som standard lager rtags en TAGS-fil som er passende for emacs (se etags.el). vi-opsjonen lager en TAGS-fil for bruk med vi.

rtags trenger å bli installert på samme måte som irb (det betyr at du trenger å installere irb i biblioteks-stien og lage en link fra irb/rtags.rb til bin/rtags).

xmp

ribs xmp er en "eksempel-printer"---det betyr en pen-printer som viser verdiene til hvert uttrykk som blir kjørt (mye som scriptet som vi skrev for å formatere eksemplene i denne boken). Det er også en annen egen-stående xmp i arkivene.

xmp kan brukes slik:

require "irb/xmp"

xmp <<END artist = "Doc Severinsen" artist END
produserer:
[pwd:/tc/work/ruby/ProgrammingRuby/latex]
artist = "Doc Severinsen"
    ==>"Doc Severinsen"
artist
    ==>"Doc Severinsen"

Eller det kan brukes som en objekt-instans. Brukt på denne måten, kan objektet vedlikeholde konteksten mellom påkallinger:

require "irb/xmp"

x = XMP.new x.puts <<END artist = "Louis Prima" END

x.puts <<END artist END
produserer:
[pwd:/tc/work/ruby/ProgrammingRuby/latex]
artist = "Louis Prima"
    ==>"Louis Prima"
artist
    ==>"Louis Prima"

Du kan eksplisitt gi en binding med begge formene, ellers bruker xmp kallerens miljø.

xmp code_string, abinding
XMP.new(abinding)

Noter at xmp ikke virker med multi-tråding.

Frame-klassen

The IRB::Frame class represents the interpreter's stack and allows easy access to the Binding environment in effect at different stack levels.

IRB::Frame.top(n = 0) Returns a Binding for the nth context from the top. The 0th context is topmost, most recent frame.
IRB::Frame.bottom(n = 0) Returns a Binding for the nth context from the bottom. The 0th context is the bottommost, initial frame.
IRB::Frame.sender Returnerer objektet(senderen) som påkalte den nåværende metoden.

Du kan bruke denne egenskapen, f.eks. til å eksaminere lokale variable fra metoden som kalte den nåværende metoden:

require 'irb/frame'

def outie   b = IRB::Frame.top(1)   eval "p my_local", b end

def innie   my_local = 102.7   outie end

innie
produserer:
102.7

Noter at dette ikke går med multi-tråd-programmer.

( In progress translation to Norwegian by NorwayRUG. $Revision: 1.5 $ )
$Log: irb.xml,v $
Revision 1.5  2002/12/06 16:16:39  kent
Første kladd sendt inn fra Jostein.


Forrige < Innhold ^
Neste >

Extracted from the book "Programming Ruby - The Pragmatic Programmer's Guide".
Translation to norwegian by Norway Ruby User Group.
Copyright for the english original authored by David Thomas and Andrew Hunt:
Copyright © 2001 Addison Wesley Longman, Inc.
This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, v1.0 or later (the latest version is presently available at
http://www.opencontent.org/openpub/).

(Please note that the license for the original has changed from the above. The above is the license of the original version that was used as a foundation for the translation efforts.)

Copyright for the norwegian translation:
Copyright © 2002 Norway Ruby User Group.
This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, v1.0 or later (the latest version is presently available at
http://www.opencontent.org/openpub/).
Distribution of substantively modified versions of this document is prohibited without the explicit permission of the copyright holder.
Distribution of the work or derivative of the work in any standard (paper) book form is prohibited unless prior permission is obtained from the copyright holder.