|
|||
Forrige < |
Innhold ^
|
Neste >
|
KCODE
-opsjonen settes til en passende verdi, slik
som vist på side 137.
]
Ruby er et linjeorientert språk. Uttrykk og utsagn termineres i Ruby
ved slutten av linjen med mindre utsagnet er åpenbart uferdig---for eksempel
dersom det siste elementet på en linje er en operator eller et komma.
Semikolon kan brukes for å separere mellom flere uttrykk på en linje.
Du kan også sette en backslash på slutten av en linje for å kunne fortsette
på neste linje. Kommentarer starter med `#' og går til slutten av
den fysiske linjen. Kommentarer ignoreres ved kompilering.
a = 1 b = 2; c = 3 d = 4 + 5 + # no '\' needed 6 + 7 e = 8 + 9 \ + 10 # '\' needed |
=begin
og
en linje som begynner med =end
ignoreres av kompilatoren og
kan brukes for å skrive innebakt dokumentasjon
(se vedlegg A, som starter på side 511).
Ruby leser sitt programinnput i en gjennomgang, så du kan sende programmer
direkte til kompilatorens stdin
.
echo 'print "Hello\n"' | ruby |
__END__
'', uten mellomrom hverken foran eller bak, behandler
Ruby linjen som slutten på programmet---eventuelle linjer
som følger etter denne vil ikke bli kompilert. Men du kan laste disse
linjene inn i det kjørende programmet ved å bruke det globale
IO
-objektet DATA
,
som er beskrevet på side 217.
BEGIN
-blokkene) og etter at programmet
er ferdig (END
-blokkene).
BEGIN { begin kode } END { end kode } |
BEGIN
og END
blokker.
BEGIN
-blokker utføres i rekkefølgen de dukker opp under
kompilering mens END
-blokker utføres i motsatt rekkefølge.
Generell avgrenset innput
|
(
'',
``[
'', ``{
'' eller ``<
'' vil literalen
bestå av tegnene opp til det passende lukkende avgrensningstegnet, med
nøstede avgrensingspar tatt i betraktning. For alle andre
avgrensningstegn vil literalen bestå av tegnene frem til neste gang
avgrensningstegnet forekommer.
%q/this is a string/ %q-string- %q(a (nested) string) |
%q{def fred(a) a.each { |i| puts i } end} |
Fixnum
eller Bignum
.
Fixnum
-objekter holder heltall som får plass inne i maskinarkitekturens ord (word) minus 1 bit. Når et Fixnum
går utover
denne rekkevidden, omdannes det automatisk til et Bignum
-objekt, som har en rekkevidde som kun bekrenses av mengden tilgjengelig minne.
Dersom en operasjon med et Bignum
resultat har en endelig verdi som passer inn i en Fixnum
, vil resultatet komme ut som en Fixnum
.
Heltall skrives med et valgfritt pluss- eller minustegn, en valgfri baseindikator
(0
for oktal, 0x
for heksidesimal eller 0b
for binært), fulgt av en streng av sifre i den angitte basen.
Understrekningstegn i strengen ignoreres.
for binary),
Du kan få tak i ASCII heltallsverdien til et tegn ved å plassere
et spørsmålstegn foran. Kontroll- og metakombinasjoner av tegn kan også
genereres ved å bruke ?\C-x, ?\M-x og ?\M-\C-x.
Kontrollversjonen av ch
er ch&0x9f
og
metaversjonen er ch | 0x80
. Du kan få tak i
heltallsverdien til et backslashtegn ved sekvensen ?\\
.
123456 # Fixnum 123_456 # Fixnum (understrekningstegn ignoreres) -543 # Negativ Fixnum 123_456_789_123_345_789 # Bignum 0xaabb # Heksadecimal 0377 # Oktal -0b1010 # Binært (negetert) 0b001_001 # Binært ?a # tegnkode ?A # stor bokstav ?\C-a # kontroll a = A - 0x40 ?\C-A # hvorvidt det er store eller små bokstaver ignoreres for kontrolltegn ?\M-a # meta setter bit 7 ?\M-\C-a # meta og kontroll a |
Float
-objekt som tilsvarer
den underliggende arkitekturens double
datatype.
Du må ha et siffer etter desimaltegnet, siden
1.e3
vil forsøke å kalle metoden e3
i klassen Fixnum
.
12.34
|
» |
12.34
|
-.1234e2
|
» |
-12.34
|
1234e-2
|
» |
12.34
|
String
.
Mekanismene varierer i hvordan strengen avgrenses og hvor stor grad
av substitusjon som gjøres på innholdet.
Enkelt-siterte strenger ('
stuff
'
og
%q/stuff/)
gjennomgår minst substitusjon.
Begge versjonene endrer sekvensen \\
til en enkelt backslash og
formen med apostrof konverterer \' til en enkelt apostrof.
'hello'
|
» |
hello
|
'a backslash \'\\\''
|
» |
a backslash '\'
|
%q/simple string/
|
» |
simple string
|
%q(nesting (really) works)
|
» |
nesting (really) works
|
%q no_blanks_here ;
|
» |
no_blanks_here
|
Substitusjon i dobbelt-siterte strenger
|
a = 123
|
||
"\123mile"
|
» |
Smile
|
"Say \"Hello\""
|
» |
Say "Hello"
|
%Q!"I said 'nuts'," I said!
|
» |
"I said 'nuts'," I said
|
%Q{Try #{a + 1}, not #{a - 1}}
|
» |
Try 124, not 122
|
%<Try #{a + 1}, not #{a - 1}>
|
» |
Try 124, not 122
|
"Try #{a + 1}, not #{a - 1}"
|
» |
Try 124, not 122
|
a = 123 print <<HERE Double quoted \ here document. Sum = #{a + 1} HERE print <<-'THERE' This is single quoted. The above used #{a + 1} THERE |
Double quoted here document. Sum = 124 This is single quoted. The above used #{a + 1} |
String
-objekt.
'Con' "cat" 'en' "ate"
|
» |
"Concatenate"
|
jcode
-biblioteket et sett av
operasjoner på strenger skrevet med EUC, SJIS eller UTF-8 koding.
Den underliggende strenger blir dog fremdeles aksessert som en
serie av bytes.]
og hver byte kan inneholde hvilken som helst av de 256 8-bits verdiene,
inklusive null og linjeskift.
Substitusjonsmekasnismene i tabell 18.2 på
side 203
tillater enkelt og portabel innsetting av tegn som ikke kan printes.
Hver gang en strengliteral brukes i en tilordning eller som
en parameter blir et nytt String
-objekt laget.
for i in 1. print 'hello'.id, " " end |
537763324 537763034 537763004 |
String
starter
på side 363
..
expr og expr
...
expr
Range
-objekter.
Varianten med to punktum er en inklusiv rekke mens varianten med tre punktum
er en rekke som ekskluderer det siste elementet.
Se beskrivelsen av klassen Range
på
side 359 for ytterlige
detaljer. Se også beskrivelsen av betingelsesuttrykk på
side 222 for andre bruksområder av rekker.
Array
lages ved å
skrive en liste av objektreferanser separert med
komma mellom firkantparenteser.
Et eventuelt ekstra kommategn på slutten ignoreres.
arr = [ fred, 10, 3.14, "This is a string", barney("pebbles"), ] |
%w
. Denne notasjonen deler opp ved mellomrom slik at man
får en tabell med ordene som elementer. Et mellomrom kan escapes
med en backslash. Dette er en generell avgrenset form for innput som
beskreves på sidene 200--201.
arr = %w( fred wilma barney betty great\ gazoo )
|
||
arr
|
» |
["fred", "wilma", "barney", "betty", "great gazoo"]
|
Hash
skrives som en liste av nøkkel/verdi-par
mellom krøllparenteser, med enten et komma eller sekvensen =>
mellom nøkkelen og verdien. Et eventuelt ekstra komma på slutten ignoreres.
colors = { "red" => 0xf00, "green" => 0x0f0, "blue" => 0x00f } |
hash
med en hashverdi og hashverdien for en gitt nøkkel må ikke endre seg.
Det betyr at visse klasser (slik som Array
og Hash
i skrivende stund) ikke kan brukes som
nøkler uten videre, fordi hashverdiene deres endrer seg ut fra innholdet.
Dersom du holder en ekstern referanse til et objekt som brukes som en nøkkel
og bruker den referansen til å endre objektet og dermed dets hashverdi,
kan det være at hashoppslag på nøkkelen ikke vil fungere.
Siden strenger både er den mest brukte formen for nøkler og ofte endrer
innhold, behandler Ruby strengnøkler spesielt.
Dersom du bruker et String
-objekt som en
nøkkel vil hashtabellen duplisere strengen internt og bruke den kopien som
sin nøkkel. Eventuelle endringer gjort på den opprinnelige strengen
i etterkant vil ikke påvirke hashtabellen.
Dersom du skriver dine egne klasser og bruker instanser av dem som nøkler i en hashtabell må du være sikker på at enten
(a) hashverdiene til nøkkelobjektene ikke endrer seg etter at objektene har blitt laget eller
(b) du husker å kalle metoden
Hash#rehash
for å reindeksere en hashtabell når hashverdien til en nøkkel endres.
:Object :myVariable |
Regexp
.
De kan lages ved å eksplisitt kalle konstruktøren
Regexp.new
eller ved å bruke de literale formene
/mønster/ og %r{
mønster
}
.
Varianten med %r
er en form for generell avgrenset innput
(beskrevet på sidene 200--201).
/pattern/ /pattern/options %r{pattern} %r{pattern}options Regexp.new( 'pattern' [, options ] ) |
Regexp
-objektet
utgjør opsjonene en eller flere tegn plassert rett etter det terminerende tegnet. Dersom du derimot bruker Regexp.new
, gir du opsjonene ved hjelp av den andre parameteren til konstruktoren og en håndfull konstanter.
i
|
Case Insensitive.
Mønsteret vil ikke gjøre forskjell på store og små bokstaver.
Sammenligninger fungerer også slik dersom den globale variabelen $= er satt.
|
o
|
Substitute Once.
Eventuelle #{...} substitusjoner i literalen for et gitt regulært uttrykk vil bare bli
utført en gang når det først evalueres. Hvis ikke vil substitusjonene bli
utført hver gang literalen genererer et Regexp -objekt.
|
m
|
Multiline Mode.
Vanligvis slår tegnet ``.'' ut på alle tegn, med unntak av linjeskift.
Med opsjonen /m slår ``.'' ut på alle tegn.
|
x
|
Extended Mode. Kompliserte regulære uttrykk kan være vanskelige å lese. Opsjonen `x' lar deg legge til mellomrom, linjeskift og kommentarer i mønsteret for å gjøre det lettere å lese. |
^
$
\A
\z
\Z
\b
, \B
[
tegn
]
|, (, ), [, ^, $, *,
og ?
som har spesiell betydning
andre steder i mønstre, mister deres særegne signifikans mellom firkantparenteser.
Sekvensene
\
nnn, \x
nn, \c
x, \C-
x, \M-
x og \M-\C-
x
fungerer som vist i tabell 18.2 på side 203.
Sekvensene \d
, \D
, \s
, \S
, \w
og \W
er kortformer for grupper av tegn, som vist i tabell 5.1 på
side 59.
Sekvensen c1-c2 representerer alle tegn fra og med
c1 til og med c2.
Literale ]
eller -
tegn må komme umiddelbart etter den
åpnende firkantparentesen. En oppoverpil (^) umiddelbart etter den første åpnende firkantparentesen
negeterer betydningen til mønsteret---det slår ut på et hvert tegn som ikke er i tegnklassen.
\d
, \s
, \w
.
(punktum)
/m
-opsjonen slår den også ut på linjeskift).
*
+
{m,n}
?
*
, +
og {m,n}
er
grådige til vanlig. Legg til et spørsmålstegn for å gjøre dem slik at
de slår ut på minst mulig.
|
re2
(...)
/abc+/
ut på en streng som inneholder en
``a,'' en ``b,''
og en eller flere``c''-er. Derimot slår /(abc)+/
ut på
en eller flere sekvenser av ``abc''.
Parenteser brukes også for å samle resultatene fra sammenligningene.
For hver åpnende parentes lagrer Ruby resultatet til delen av
sammenligningen mellom den og den korresponderende lukkende parentesen
som påfølgende grupper. Inne i samme mønster referer
\1
til hva den første gruppen slo ut på, \2
hva den andre gruppen slo ut på og så videre.
På utsiden av mønsteret har de spesielle variablene $1
, $2
og så videre, samme nytten.
#{...}
/o
-opsjonen utføres substitusjonen kun første gang.
\0, \1, \2, ... \9, \&, \`, \', \+
(?
og )
.
Parentesene som avgrenser disse utvidelsene er grupper men de genererer ikke
tilbakereferanser: de tilordner ikke verdier til \1
og $1
etc.
(?# kommentar)
(?:re)
$1
eller lignende. I eksempelet som følger slår begge mønstrene ut på en dato
med enten kolon eller mellomrom mellom måneden, dagen og året.
Den første varianten lagrer separeringstegnene i $2
og $4
,
mens den andre varianten ikke lagrer separatorene i en ekstern variabel.
date = "12/25/01"
|
||
date =~ %r{(\d+)(/|:)(\d+)(/|:)(\d+)}
|
||
[$1,$2,$3,$4,$5]
|
» |
["12", "/", "25", "/", "01"]
|
date =~ %r{(\d+)(?:/|:)(\d+)(?:/|:)(\d+)}
|
||
[$1,$2,$3]
|
» |
["12", "25", "01"]
|
(?=re)
$&
. I dette eksempelet slår scan
metoden
ut på ord som følges av et komma, men selve kommategnene blir ikke inkludert
i resultatet.
str = "red, white, and blue"
|
||
str.scan(/[a-z]+(?=,)/)
|
» |
["red", "white"]
|
(?!re)
/hot(?!dog)(\w+)/
på et hvert ord
som inneholder bokstavene ``hot'' som ikke følges av ``dog''
og ved sammenligning returneres slutten av ordet i $1
.
(?>re)
/a.*b.*a/
eksponensiell tid
når man sammenligner med en streng som har en ``a'' fulgt av en mengde
``b''-er, uten en avsluttende ``a.'' Men dette kan unngås dersom
man bruker et nøstet regulært uttrykk som /a(?>.*b).*a/
.
I denne formen vil det nøstede uttrykket spise opp alt den kan
i fra innputstrenget opp til den siste ``b.'' Når
sjekken for en etterfølgende ``a'' så feiler, er det ikke nødvendig å
gå tilbake og sammenligningen feiler umiddelbart.
require "benchmark" include Benchmark str = "a" + ("b" * 5000) bm(8) do |test| test.report("Normal:") { str =~ /a.*b.*a/ } test.report("Nested:") { str =~ /a(?>.*b).*a/ } end |
user system total real Normal: 4.170000 0.000000 4.170000 ( 4.150970) Nested: 0.000000 0.000000 0.000000 ( 0.001529) |
(?imx)
(?-imx)
(?imx:re)
(?-imx:re)
Reserverte ord
|
fred anObject _x three_two_one |
@
'')
fulgt av en stor eller liten bokstav, og eventuelt ytterlige navnebokstaver.
@name @_ @Size |
@@
'')
fulgt av en stor eller liten bokstav, og eventuelt ytterlige navnebokstaver.
@@name @@_ @@Size |
module Math PI = 3.1415926 end class BigBlob |
$
'') fulgt av navnebokstaver.
I tillegg er det et sett med to-tegns variabelnavn hvor det andre tegnet
er et punktueringstegn. Disse predefinerte variablene listes
opp på side 213.
Til slutt nevner vi at variabelnavnet til en global variabel kan
formes ved å bruke ``$-
'' fulgt av et hvert enkelt tegn.
$params $PROGRAM $! $_ $-a $-. |
def a print "Function 'a' called\n" 99 end for i in 1..2 if i == 2 print "a=", a, "\n" else a = 1 print "a=", a, "\n" end end |
a=1 Function 'a' called a=99 |
a = 1 if false; a |
MY_CONST = 1 MY_CONST = 2 # generates a warning |
prog.rb:2: warning: already initialized constant MY_CONST |
MY_CONST = "Tim"
|
||
MY_CONST[0] = "J" # endrer streng som referes til av en constant
|
||
MY_CONST
|
» |
"Jim"
|
::
''
med et uttrykk foran som returnerer modulen eller klassen det er snakk om.
Konstanter utenfor en hver klasse eller modul kan man få tak i uten
noe ekstra eller ved å bruke skop-operatoren ``::
'' uten
noe foran. Konstanter kan ikke defineres i metoder.
OUTER_CONST = 99
|
||
class Const
|
||
def getConst
|
||
CONST
|
||
end
|
||
CONST = OUTER_CONST + 1
|
||
end
|
||
Const.new.getConst
|
» |
100
|
Const::CONST
|
» |
100
|
::OUTER_CONST
|
» |
99
|
nil
.
Klassevariabler er tilgjengelig alle steder i kroppen til en klasse
eller modul. Klassevariabler må initialiseres før bruk.
En klassevariabel er delt mellom alle instanser av klassen og
er tilgjenglig inne i selve klassen.
class Song @@count = 0 def initialize @@count += 1 end def Song.getCount @@count end end |
Object
og oppfører seg som globale variabler.
Klassevariabler definert i singleton-metoder tilhører mottakeren dersom
det er en klasse eller modul; hvis ikke tilhører de klassen til mottakeren.
class Holder @@var = 99 def Holder.var=(val) @@var = val end end a = Holder.new def a.var @@var end |
Holder.var = 123
|
||
a.var
|
» |
123
|
nil
. Hver instans av en klasse har et unikt sett
av instansvariabler. Instansvariabler er ikke tilgjengelig i
klassemetoder.
Lokale variabler er unike i at deres skop er bestemt statisk, mens
deres eksistens bestemmes dynamisk.
En lokal variabel lages dynamisk når den for første gang blir tilordnet
en verdi under utføring av programmet. Skopet til en lokal variabel er
derimot statisk bestemt til å være: den umiddelbart omliggende blokken,
metodedefinisjonen, klassedefinisjonen, moduldefinisjonen eller
toppnivå programmet.
Forsøk på å referere til en lokal variabel som er i skopet men ikke ennå
har blitt laget genererer et NameError
-unntak.
Lokale variabler med samme navn utgjør forskjellige variabler dersom
de dukker opp i atskilte skop.
Metodeparametre anses som lokale variabler til metoden.
Blokkparametre blir tilordnet verdier når blokken kalles.
a = [ 1, 2, 3 ] a.each { |i| puts i } # i local to block a.each { |$i| puts $i } # assigns to global $i a.each { |@i| puts @i } # assigns to instance variable @i a.each { |I| puts I } # generates warning assigning to constant a.each { |b.meth| } # invokes meth= in object b sum = 0 var = nil a.each { |var| sum += var } # uses sum and var from enclosing scope |
while
, until
og for
-løkker
utgjør en del av skopet som inneholder dem.
Lokale variabler opprettet før løkken kan bli brukt inni løkken
og eventuelle nye lokale variabler vil være tilgjengelig
på utsiden av løkken etterpå.
true
halveis inne i programmet ditt
(med mindre du er en politiker). Elementer markert med
[thread] er trådlokale.
Mange globale variabler ser ut som banning fra Snoopy:
$_
, $!
, $&
og så videre.
Dette skyldes ``historiske'' grunner, siden mesteparten av disse
variabelnavnene kommer fra Perl. Dersom du syntes det er vanskelig
å huske på hva alle disse symbolene betyr, ta en titt på
biblioteksfilen kalt ``English'' som er dokumentert på
side 445.
Den gir mer beskrivende navn til de mest brukte globale variablene.
I de tabellene over variabler og konstanter som følger under,
viser vi variabelens navn, typen til objektet som referes og en
beskrivelse.
$! | Exception | Unntaksobjektet som ble sent til raise .
[thread] |
$@ | Array |
Kallstakken til det siste unntaket. Se
Kernel#caller
på side 413 for detaljer.
[thread] |
$=
) settes til nil
etter at en mønstersammenligning har feilet.
$& | String | Strengen som slo ut på siste suksessfylte mønstersammenligning. Variabelen er lokal i det gjeldende skopet. [r/o,thread] |
$+ | String |
Innholdet til den høyeste grupperingen i det siste
suksessfylte mønstersammenligning.
Det vil si, i "cat" =~/(c|a)(t|z)/ vil $+
bli satt til ``t''. Variabelen er lokal i det gjeldende skopet.
[r/o,thread] |
$` | String | Strengen forut for biten som slo ut i siste mønstergjenkjenning. Variabelen er lokal i det gjeldende skopet. [r/o,thread] |
$' | String | Strengen som følger etter biten som slo ut i siste mønstergjenkjenning. Variabelen er lokal i det gjeldende skopet. [r/o,thread] |
$= | Object |
Dersom denne variablen er satt til noe annet enn nil eller
false
vil det ikke gjøres forskjell på store og små bokstaver i
alle mønstergjenkjenninger, strengsammenligninger og i hashverdier til
strenger.
|
$1 til $9 | String |
Innholdet til de påfølgende gruppene i siste mønstergjenkjenning.
For eksempel vil "cat" =~/(c|a)(t|z)/ sette $1
til ``a'' og $2 til ``t''.
Denne variabelen er lokal i det gjeldende skopet.
[r/o,thread] |
$~ | MatchData |
Et objekt som innekapsler resultatene fra en suksessfylt mønstergjenkjenning.
Variablene $& ,
$` , $' og $1 til $9
blir alle utledet fra
$~ . Tilordning til $~ endrer de utledete variablene.
Variabelen er lokal i det gjeldende skopet.
[thread] |
$/ | String |
Avgrensningstegn i innput (vanligvis linjeskift). Dette er verdien rutiner som
Kernel#gets
bruker for å bestemme grensene til deler av innput. Dersom den er satt til
nil vil gets lese hele filen.
|
$-0 | String | Synonym for $/ . |
$\ | String |
Strengen som legges til på slutten av utput ved hvert kall til metoder slik som
Kernel#print
og
IO#write
.
Default verdi er nil .
|
$, | String |
Avgrensningsstrengen som sendes i mellom parametrene til metoder slik som
Kernel#print
og
Array#join
.
Default verdi er nil , som ikke legger til noe tekst.
|
$. | Fixnum | Nummeret til den siste linjen som ble lest inn fra den gjeldende innputfilen. |
$; | String |
Det avgrensningsmønsteret som vanligvis brukes av
String#split
.
Kan settes fra kommandolinjen ved å bruke opsjonen -F .
|
$< | Object |
Et objekt som gir tilgang til innholdet av alle filene som ble gitt som kommandolinje argumenter,
eller $stdin (dersom det ikke ble gitt noen argumenter).
$< støtter metoder omtrent som et
File -objekt:
binmode , close ,
closed? , each ,
each_byte , each_line ,
eof , eof? , file ,
filename , fileno ,
getc , gets , lineno ,
lineno= , pos , pos= ,
read , readchar ,
readline , readlines ,
rewind , seek , skip ,
tell , to_a , to_i ,
to_io , to_s ,
i tillegg til metodene i Enumerable .
Metoden file returnerer et File -objekt for
filen som leses akkurat nå. Dette kan endre seg etter hvert som $<
leser seg gjennom filene på kommandolinjen.
[] |
$> | IO |
Målet for utput sendt ved hjelp av
Kernel#print
og
Kernel#printf
.
Standardverdien er $stdout .
|
$_ | String |
Den siste linjen som ble lest inn med
Kernel#gets
eller
Kernel#readline
.
Mange strengrelaterte funksjoner i Kernel -modulen
opererer på $_ per default.
Variabelen er lokal i det gjeldende skopet.
[thread] |
$defout | IO | Synonym for $> . |
$-F | String | Synonym for $; . |
$stderr | IO | Det gjeldende målet for standard feilutput. |
$stdin | IO | Den gjeldende kilden til standard innput. |
$stdout | IO | Det gjeldende målet for standard utput. |
$0 | String |
Navnet på toppnivå Ruby programmet som blir kjørt.
Typisk vil dette være programmets filnavn.
På noen operativsystemer kan man tilordne denne variabelen
for å endre navnet som prosessen rapporterer når man (f.eks.)
kaller ps(1) kommandoen.
|
$* | Array | En Array av strenger som inneholder kommandolinjeopsjonene fra når programmet ble kjørt. Opsjonene som Ruby-fortolkeren bruker vil ha blitt fjernet. [r/o] |
$" | Array |
En Array som inneholder filnavnene til modulene som har blitt lastet
inn ved bruk av require .
[r/o] |
$$ | Fixnum | Prosessnummeret til programmet som kjører. [r/o] |
$? | Fixnum | Avslutningskoden til den siste barneprosessen som terminerte. [r/o, thread] |
$: | Array |
En Array av strenger hvor hver string spesifiserer en
katalog hvor Ruby skal søke etter skript og binære utvidelser
som hentes inn ved hjelp av metodene
load og require .
Den opprinnelige verdien utgjøres av argumentene sendt inn via
kommandolinjeopsjonen -I , fulgt av en
installasjonsavhengig standard biblioteksplassering og til sist den gjeldende katalogen (``.''). Denne variabelen kan endres fra inne i et program
for å endre søkestien.
Typisk brukes $: << dir til å legge til katalogen
dir til søkestien.
[r/o] |
$-a | Object |
Er lik true dersom kommandolinjeopsjonen -a
ble gitt.
[r/o] |
$-d | Object | Synonym for $DEBUG . |
$DEBUG | Object |
Satt til true dersom kommandolinjeopsjonen -d
ble angitt.
|
__FILE__ | String | Navnet til den nåværende kildekodefilen. [r/o] |
$F | Array |
En Array som mottar den oppdelte innputlinjen dersom
kommandolinjeopsjonen -a brukes.
|
$FILENAME | String |
Navnet til den gjeldende innputfilen.
Ekvivalent med $<.filename .
[r/o] |
$-i | String |
Dersom overskrivende editeringsmodus (in-place edit mode) er slått på
(f.eks. ved bruk av kommandolinjeopsjonen -i ) vil
$-i inneholde filendelsen som brukes når
backupfilen lages. Dersom du setter en verdi inn i $-i
slår du på overskrivende editeringsmodus.
Se side 136.
|
$-I | Array | Synonym for $: .
[r/o] |
$-K | String |
Spesifiserer det multibyte kodingssystemet (eller tegnsettet)
som skal brukes for strenger og regulære uttrykk.
Ekvivalent med kommandolinjeopsjonen -K .
side 137.
|
$-l | Object |
Satt til true dersom kommandolinjeopsjonen
-l (som slår på prosessering av linjeendelser) ble
angitt.
Se side 137.
[r/o] |
__LINE__ | String | Nummeret til den gjeldende linjen i kildekodefilen. [r/o] |
$LOAD_PATH | Array | Et synonym for $: . [] |
$-p | Object |
Satt til true dersom kommandolinjeopsjonen
-p (som legger en implisitt
while gets ... end løkke rundt programmet ditt)
er angitt.
Se side 137.
[] |
$SAFE | Fixnum | Det gjeldende sikkerhetsnivået (se side 254). Variabelens verdi kan ikke reduseres ved tilordning. [thread] |
$VERBOSE | Object |
Satt til true dersom en av kommandolinjeopsjonene
-v ,
--version eller
-w
ble angitt. Ved å sette denne opsjonen til true
vil fortolkeren og noen biblioteksrutiner rapportere ytterlige informasjon.
|
$-v | Object | Synonym for $VERBOSE . |
$-w | Object | Synonym for $VERBOSE . |
ARGF | Object | Et synonym for $< . |
ARGV | Array | Et synonym for $* . |
ENV | Object |
Et Hash-lignende objekt som inneholder programmets miljøvariabler.
ENV er en instans av klassen Object
som implementerer hele settet av Hash sine metoder.
Brukes for å hente og sette verdiene til miljøvariabler, slik som
ENV["PATH"] og ENV['term']="ansi" .
|
false | FalseClass |
Eneste (singleton) instans av klassen FalseClass .
[r/o] |
nil | NilClass |
Eneste (singleton) instans av klassen NilClass .
Default verdi til instans- og globale variabler som ikke
har blitt initialisert.
[r/o] |
self | Object | Mottakeren (objektet) til den gjeldende metoden. [r/o] |
true | TrueClass |
Eneste (singleton) instans av klassen TrueClass .
[r/o] |
DATA | IO |
Dersom hovedprogramfilen inneholder direktivet
__END__ så vil konstanten DATA
settes opp slik at ved å lese fra den får man tak i linjene
som følger etter __END__ i kildekodefilen.
|
FALSE | FalseClass | Synonym for false . |
NIL | NilClass | Synonym for nil . |
RUBY_PLATFORM | String | Identifiserer plattformen programmet kjører på. Denne strengen er bygd opp på samme måte som plattformidentifikatoren som GNU configure verktøyet bruker (og det er ikke tilfeldig). |
RUBY_RELEASE_DATE | String | Datoen denne versjonen av Ruby ble sluppet. |
RUBY_VERSION | String | Versjonsnummeret til fortolkeren. |
STDERR | IO |
Den faktiske standard feilstrømmen til programmet.
Er også den opprinnelige verdien til $stderr .
|
STDIN | IO |
Den faktiske standard innputstrømmen til programmet.
Er også den opprinnelige verdien til $stdin .
|
STDOUT | IO |
Den faktiske standard utputstrømmen til programmet.
Er også den opprinnelige verdien til $stdout .
|
TOPLEVEL_BINDING | Binding |
Et Binding -objekt som representerer konteksten til Ruby sitt toppnivå---hvor programmer blir startet.
|
TRUE | TrueClass | Synonym for true . |
`
)
eller en generell avgrenset streng
(side 200)
som starter med %x
.
Verdien strengen returnerer er standard utput fra kjøringen av kommandoen
som strengen utgjør i operativsystemets standard skall.
Kjøringen setter også variabelen $?
til skallkommandoens avslutningskode.
filter = "*.c" files = `ls #{filter}` files = %x{ls #{filter}} |
Symbol
-objekt lages ved å sette et kolontegn foran
et operator-, variabel-, konstant-, metode-, klasse- eller modulnavn.
Symbolet vil være unikt for hvert forskjellig navn, men refererer ikke
til en spesifikk instans av navnet, så symbolet til (for eksempel)
:fred
vil være det samme uansett kontekst.
Et symbol ligner på konseptet atomer i andre høynivå språk.
::
'').
barney # variabelreferanse APP_NAMR # konstantreferanse Math::PI # kvalifisert konstantreferanse |
Ruby operatorer (fra høy til lav presedens)
|
a, b, c = 1, "cat", [ 3, 4, 5 ] |
anObj = A.new anObj.value = "hello" # ekvivalent med anObj.value=("hello") |
[]=
'') på mottakeren.
Som parametre sendes eventuelle indekser som dukker opp
mellom firkantparantesene, fulgt av r-verdien.
Dette illustreres i tabell 18.5 på side 220.
Kobling mellom elementreferanse og metodekall
|
Array
så blir r-verdien byttet ut med
elementene i tabellen, med hvert element som en egen r-verdi.
Array
som
ekspanderes til et sett av r-verdier slik som i (1).
a,b=b,a
bytter om på verdiene i ``a'' og ``b.''
nil
.
Array
under tilordning.
Tabellen vil inneholde den r-verdien som normalt ville blitt tilordnet til
denne l-verdien, og eventuelt de øvrige ekstra r-verdiene.
begin kropp end |
begin
og end
.
Verdien til blokkuttrykket er verdien til det siste uttrykket som evalueres.
Blokkuttrykk kan også spille en rolle i forbindelse med håndtering av
unntak, som diskuteres på side 235.
false
og nil
.
Begge disse verdiene behandles som usanne i en boolsk sammenheng.
Alle andre verdier behandles som sanne.
and
og &&
evaluerer den
første operanden. Dersom den er usann returnerer uttrykket usann, hvis ikke returnerer uttrykket verdien til den andre operanden.
expr1 and expr2 expr1 && expr2 |
or
og ||
evaluerer den første operanden.
Dersom den er sann returnerer uttrykket sann, hvis ikke returnerer
uttrykket verdien til den andre operanden.
expr1 or expr2 expr1 || expr2 |
not
og !
evaluerer operanden. Dersom den
er sann, returnerer uttrykket usann og motsatt.
Varianten av disse operandene skrevet med hele ord
(and
, or
og not
)
har lavere presedens enn de tilsvarende formene som kun utgjøres av symboler
(&&
, ||
og !
).
Se tabell 18.4 på side 218.
Operatoren defined?
returnerer nil
dersom argumentet dens,
som kan være et vilkårlig uttrykk, ikke er definert.
Hvis ikke returneres en beskrivelse av argumentet.
For noen eksempler, se side 78 i innføringen.
==
, ===
,
<=>
, <
, <=
, >
, >=
, =~
samt standardmetodene
eql?
og equal?
(se tabell 7.1 på side 79).
Alle disse operatorene er implementert som metoder.
Selv om operatorene har en intuitiv betydning, er det opp til
klassene som implementerer dem å innføre en meningsfull semantikk.
Biblioteksreferansen som starter på side 275
beskriver sammenligningssemantikken til de innebygde klassene.
Modulen Comparable
tilbyr støtte
slik at man kan implmentere operatorene
==
,
<
, <=
, >
, >=
og metoden between?
ut fra <=>
.
Operatoren ===
brukes i case
-uttrykk, som
beskrevet på side 223.
Både ==
og =~
har negeterte former,
!=
og !~
. Ruby konverterer mellom disse når
syntaksen analyseres:
a!=b
blir til !(a==b)
og a!~b
blir til !(a =~b)
. T
Det er ingen metoder som tilsvarer
!=
eller !~
.
if expr1 .. expr2 while expr1 ... expr2 |
true
dersom den er i satt-tilstand ved
slutten av kallet og false
ellers.
Rekker av to-punktumsformen oppfører seg litt anderledes enn
rekker av tre-punktumsformen. Når en to-punktums rekke først
går i fra usatt til satt, evaluerer den umiddelbart
avslutningsbetingelsen for så å gjøre den overgangen.
Dette betyr at dersom både expr1 og expr2
evaluerer til true
på et og samme kall, så vil
to-punktumsformen avslutte kallet i usatt tilstand.
Men den returnerer dog true
for selve kallet.
Forskjellen kan illustreres av følgende kode:
a = (11..20).collect {|i| (i%4 == 0)..(i%3 == 0) ? i : nil}
|
||
a
|
» |
[nil, 12, nil, nil, nil, 16, 17, 18, nil, 20]
|
|
||
a = (11..20).collect {|i| (i%4 == 0)...(i%3 == 0) ? i : nil}
|
||
a
|
» |
[nil, 12, 13, 14, 15, 16, 17, 18, nil, 20]
|
Figur 18.1: Tilstandsoverganger for boolske rekker |
$_
.
if /re/ ... |
if $_ =~ /re/ ... |
if boolsk-uttrykk [then] body elsif boolsk-uttrykk [then] body else body end |
unless boolsk-uttrykk [then] body else body end |
then
separerer kroppen fra betingelsen.
Det er ikke påkrevd dersom kroppen starter på en ny linje.
Verdien til et if
- eller unless
-uttrykk er det
samme som verdien til siste uttrykket som evalueres når kroppen utføres.
uttrykk if boolsk-uttrykk uttrykk unless boolsk-uttrykk |
true
(false
for unless
).
boolsk-uttrykk ? expr1 : expr2 |
case target when [ comparison ]+ [then] body when [ comparison ]+ [then] body ... [ else body ] end |
===
target.
Når en sammenligning returnerer sann stoppes søket og kroppen
assosiert med den sammenligningen utføres. Deretter returnerer
case
verdien til det siste evaluerte uttrykket i kroppen.
I de tilfeller hvor ingen comparison slår til,
vil en eventuelt else
-klausul bli utført. Dersom det heller
ikke er en else
tilstede, vil case
stille og
forsiktig returnere nil
.
Nøkkelordet then
separerer when
-sammenligningene fra
kroppene og er ikke nødvendig dersom kroppen starter på en ny linje.
while boolsk-uttrykk [do] body end |
until boolsk-uttrykk [do] body end |
do
boolsk-uttrykk
fra body og kan utelates dersom kroppen starter på en ny linje.
for [ name ]+ in uttrykk [do] body end |
for
utføres som om den var følgende each
-løkke,
med det unntak at lokale variabler derfinert i kroppen til
for
-løkken vil være tilgjengelig på utsiden av løkken, mens
de definert inne i en iteratorblokk ikke vil være det.
uttrykk.each do | [ name ]+ | body end |
loop
,
som itererer over dens assosierte blokk, er ikke en konstruksjon i språket---det
er en metode i modulen Kernel
.
uttrykk while boolsk-uttrykk uttrykk until boolsk-uttrykk |
begin/end
-blokk
utføres uttrykk null eller flere ganger så lenge
boolsk-uttrykk er true
(false
for until
).
Dersom uttrykk er en begin/end
-blokk vil blokken
alltid bli utført minst en gang.
break
, redo
, next
og
retry
forandrer den normale flyten gjennom en
while
, until
, for
eller
iterator-kontrollert løkke.
break
terminerer den umiddelbart omsluttende løkken---kontrollen
fortsetter fra uttrykket som følger etter blokken.
redo
gjentar løkken fra starten av, men uten å hverken reevaluere
betingelsen eller hente neste element (i en iterator).
next
hopper til slutten av løkken slik at neste
iterasjon starter.
retry
starter løkken på nytt og reevaluerer betingelsen.
def defname [( [ arg [=val ] ]* [, *vararg ] [, &blockarg ] )] body end |
|
?
''),
utropstegn (``!
'') eller likhetstegn (``=
'') på slutten.
Spørsmåls- og utropstegnet er bare en del av navnet til metoden.
Likhetstegnet er også en del av navnet med gir også beskjed om at denne
metoden er en attributtsetter
(beskrevet på side 23).
En metodedefinisjon med et navn uten videre utsmykking i en klasse-
eller moduldefinisjon lager en instansmetode.
En instansmetode kan bare kalles ved å sende dens navn til
en mottaker som er en instans av klassen den er definert i
(eller en av den klassens subklasser).
Utenfor en klasse- eller moduldefinisjon vil en definisjon med et
ikke utsmykket metodenavn blir lagt til som en privat metode
i klassen Object
og kan derfor
kalles i enhver kontekst uten en eksplisitt mottaker.
En definisjon som bruker et metodenavn på formen
expr.methodname
lager en metode assosiert med objektet som er verdien til uttrykket;
metoden kan kun kalles ved å bruke det objektet som mottaker.
Andre dokumentasjonskilder kaller disse metodene for
singleton metoder.
class MyClass def MyClass.method # definition end end |
MyClass.method # call anObject = Object.new def anObject.method # definition end anObject.method # call def (1.class).fred # receiver may be an expression end Fixnum.fred # call |
begin
/end
-blokk, det vil si at den kan inneholde
unntakshåndtering (rescue
, else
og ensure
).
def options(a=99, b=a+1)
|
||
[ a, b ]
|
||
end
|
||
options
|
» |
[99, 100]
|
options 1
|
» |
[1, 2]
|
options 2, 4
|
» |
[2, 4]
|
Array
. Dersom metodekallet spesifiserte
flere parametre enn antallet vanlige argumenter i definisjonen, vil de
øvrige parametrene samles i dette nye Array
-objektet.
def varargs(a, *b)
|
||
[ a, b ]
|
||
end
|
||
varargs 1
|
» |
[1, []]
|
varargs 1, 2
|
» |
[1, [2]]
|
varargs 1, 2, 3
|
» |
[1, [2, 3]]
|
def mixed(a, b=99, *c)
|
||
[ a, b, c]
|
||
end
|
||
mixed 1
|
» |
[1, 99, []]
|
mixed 1, 2
|
» |
[1, 2, []]
|
mixed 1, 2, 3
|
» |
[1, 2, [3]]
|
mixed 1, 2, 3, 4
|
» |
[1, 2, [3, 4]]
|
Proc
og tilordnes
blokk-argumentet. Dersom det ikke var noen blokk tilstede,
settes blokk-argumentet til nil
.
|
=>
verdi par.
Disse parene samles i et enkelt Hash
-objekt og
sendt inn som en enkelt parameter.
Etter disse parametrene kan det følge en enkelt parameter med en asterisk
foran. Dersom denne parameteren er et Array
-objekt vil
Ruby bytte den ut med null eller flere parametre som korresponderer
med elementene i Array
-objektet.
def regular(a, b, *c) # .. end regular 1, 2, 3, 4 regular(1, 2, 3, 4) regular(1, *[2, 3, 4]) |
Proc
- eller Method
-objekt.
Uansett om det er et blokkargument tilstede eller ikke vil Ruby ordne slik
at verdien til den globale funksjonen
Kernel::block_given?
kan gi oss den informasjonen.
aProc = proc { 99 } anArray = [ 98, 97, 96 ] def block yield end block { } block do end block(&aProc) def all(a, b, c, *d, &e) puts "a = #{a}" puts "b = #{b}" puts "c = #{c}" puts "d = #{d}" puts "block = #{yield(e)}" end all('test', 1 => 'cat', 2 => 'dog', *anArray, &aProc) |
a = test b = {1=>"cat", 2=>"dog"} c = 98 d = [97, 96] block = 99 |
self
.
Mottakeren ser etter metodedefinisjonen i sin egen klasse og deretter
sekvensielt i forelderklassene. Instansmetoder fra inkluderte moduler
oppførerer seg som om de var i anonyme superklasser til klassen
som inkluderer dem.
Dersom metoden ikke blir funnet kaller Ruby metoden method_missing
i mottakeren. Standard oppførsel til denne metoden, som er definert i
Kernel::method_missing
, er å rapportere en feil og terminere programmet.
Når en mottaker blir spesifisert eksplisitt i et metodekall kan den
separeres fra metodenavnet enten ved hjelp av punktum ``.
''
eller to kolontegn ``::
''.
Forskjellen mellom disse to variantene slår ut dersom metodenavnet
starter med en stor bokstav. I det tilfellet vil Ruby anta at
at et metodekall på formen receiver::Thing
egentlig
er et forsøk på å få tak i en konstant Thing
i mottakeren med mindre metodekallet har en parameterliste
i mellom parenteser.
Foo.Bar() # method call Foo.Bar # method call Foo::Bar() # method call Foo::Bar # constant access |
return [ expr ]* |
return
-uttrykk vil avslutte en metode umiddelbart.
Verdien til et return
-uttrykk er nil
dersom den kalles
uten noen parameter, verdien til parameteren dersom det bare gis en parameter
eller et Array
-objekt
dersom det er mer enn en parameter.
super [ ( [ param ]* [*array ] ) ] [ block ] |
super
seg akkurat som et kall til den opprinnelige metoden, men søket
etter metodedefinisjonen vil starte i superklassen.
Dersom ingen parametre (og heller ingen parenteser) sendes til
super
, vil den opprinnelige metodens parametre bli
videresendt; ellers vil angitte parametre til super
blir sendt.
expr1 operator operator expr1 expr1 operator expr2 |
(expr1).operator(expr2) |
receiver.attrname = rvalue |
receiver [ expr ]+ receiver [ expr ]+ = rvalue |
[]
på mottakeren og uttrykkene mellom firkantparentesene
sendes inn som parametre.
Dersom en elementreferanse brukes som en l-verdi, kalles metoden
[]=
på mottakeren. Parametrene som sendes inn utgjøres av uttrykkene som ble gitt mellom firkantparentesene samt den r-verdien som ønskes tilordnet (rvalue).
alias newName oldName |
$&
, $'
, $'
og $+
).
Lokale variabler, instansvariabler, klassevariabler og konstanter kan
man ikke lage alias til.
Parameterne til alias
kan være navn eller symboler.
class Fixnum
|
||
alias plus +
|
||
end
|
||
1.plus(3)
|
» |
4
|
|
||
alias $prematch $`
|
||
"string" =~ /i/
|
» |
3
|
$prematch
|
» |
"str"
|
|
||
alias :cmd :`
|
||
cmd "date"
|
» |
"Sun Nov 25 23:44:19 CST 2001\n"
|
def meth
|
||
"original method"
|
||
end
|
||
|
||
alias original meth
|
||
|
||
def meth
|
||
"new and improved"
|
||
end
|
||
meth
|
» |
"new and improved"
|
original
|
» |
"original method"
|
class classname [< superexpr ] body end class << anObject body end |
Class
ved å utføre koden i body.
I den første variasjonen blir en navngitt klasse lagd eller utvidet.
Det resulterende Class
-objektet tilordnes til
en global konstant kalt classname. Dette navnet bør
begynne med en stor bokstav.
I den andre variasjonen blir en anonym (singleton) klasse assosiert
med det angitte objektet.
Dersom superexpr er tilstede, bør det være et uttrykk som evaluerer
til et Class
-objekt som skal installeres som
superklassen til klassen som defineres.
Hvis det er utelatt, benyttes klassen Object
som superklasse.
Inne i body blir de fleste uttrykkene bare utført etter hvert
som definisjonen leses. Men:
::
''
for å kvalifisere navnene deres.
module NameSpace class Example CONST = 123 end end obj = NameSpace::Example.new a = NameSpace::Example::CONST |
Module#include
legger de angitte modulene som anonyme superklasser til klassen som defineres.
attr
og include
)
er egentlig bare private instansmetoder i klassen Module
(dokumentert på side 344).
Kapittel 19, som starter på side 237,
beskriver i mer detalj hvordan Class
-objekter
interagerer med resten av miljøet.
obj = classexpr.new [ ( [ args ]* ) ] |
Class
definerer instansmetoden
Class#new
, som:
initialize
i det nylagede objektet og
videresender eventuelle argumenter som ble gitt til new
.
new
uten
å kalle super
, så kan ingen objekter av den klassen lages.
Module
som automatisk lager metoder for å
gi tilgang til attributter.
class name attr attribute [, writable ] attr_reader [ attribute ]+ attr_writer [ attribute ]+ attr_accessor [ attribute ]+ end |
module name body end |
Module
-objektet lagres i en
konstant.
En modul kan inneholde klasse- og instansmetoder og definere
konstanter og klassevariabler. Akkurat som for klasser blir
modulmetoder kalt ved å bruke Module
-objektet
som mottaker og man får tak i konstantene ved å bruke
skop-operatoren ``::
''.
module Mod CONST = 1 def Mod.method1 # module method CONST + 1 end end |
Mod::CONST
|
» |
1
|
Mod.method1
|
» |
2
|
class|module name include expr end |
include
-metoden. Modul- eller klassedefinisjonen
som kaller include
får tilgang til konstanter,
klassevariabler og instansmetoder til modulen som inkluderes.
Dersom en modul inkluderes i en klassedefinisjon, oppfører det seg som
om modulens konstanter, klassevariabler og instansmetoder har blitt
samlet i en anonym (og utilgjengelig) superklasse.
Blant annet vil instanser av klassen svare på meldinger sendt til
modulens instansmetoder.
En modul kan også inkluderes på toppnivå og da blir modulens
konstanter, klassevariabler og instansmetoder tilgjengelig på
topnivå.
include
er nyttig for å tilby innblandet (mixin)
funksjonalitet, er det også en måte å hente inn konstanter, klassevariabler
og instansmetoder fra en modul inn i et annet navnerom.
Men funksjonalitet definert i en instansmetode vil ikke være tilgjengelig
som en modulmetode.
module Math def sin(x) # end end # Eneste måten å få tak i Math.sin er... include Math sin(1) |
Module#module_function
løser dette problemet ved å ta en eller flere instansmetoder fra en modul og kopiere deres definisjoner inn i tilsvarende modulmetoder.
module Math def sin(x) # end module_function :sin end Math.sin(1) include Math sin(1) |
module_function
,
det lages ikke et alias.
self
som mottaker).
Private metoder kan derfor kun kalles i fra den definerende klassen og
direkte arvtakere inne i fra et og samme objekt.
private [ aSymbol ]* protected [ aSymbol ]* public [ aSymbol ]* |
do
/end
-par.
Blokken kan starte med en argumentliste mellom vertikale linjer.
En kodeblokk kan kun stå skrevet umiddelbart etter et metodekall.
Starten til blokken må være på samme logiske linje som slutten
på metodekallet.
invocation do | a1, a2, ... | end invocation { | a1, a2, ... | } |
do
/end
.
Dersom metodekallet har paremtre som ikke er samlet innenfor
parenteser vil krøllparentes-formen av en blokk bindes til den
siste parameteres og ikke det overordnede metodekallet.
Formen med do
/end
vil derimot bindes til
metodekallet.
Inne i kroppen til metoden som kalles kan kodeblokken utføres ved å
bruke yield
. Parameterne som sendes til yield
vil bli tilordnet til argumentene i blokken ut fra reglene om
parallell tilordning som beskrevet på
side 219.
Returverdien fra yield
-kallet er verdien til
det siste uttrykket som ble evaluert i blokken.
En kodeblokk husker på miljøet den var definert i og bruker
det miljøet når den kalles.
Proc
ved å bruke metodene
Proc.new
og
Kernel#proc
, eller ved å assosiere blokken med en metodes blokkargument.
Konstruktøren til Proc
tar en assosiert blokk
og pakker den inn med nok kontekst til å kunne gjenopprette
blokkens miljø når den kalles senere. Instansmetoden
Proc#call
lar deg kalle den opprinnelige blokken og eventuelt angi parametre.
Koden i blokken (og den assosierte tillukningen) forblir tilgjengelig
så lenge Proc
-objektet er i live.
Dersom siste argument i en metodes argumentliste har et og-tegn (``&
'') foran, vil en eventuell blokk assosiert med kall til den metoden
omformes til et Proc
-objekt og tilordnet
til den parameteren.
Exception
og
dens subklassen (en fullstendig liste av de innebygde unntakene finnes i
figur 8.1 på side 91).
Kernel::raise
hever et unntak.
raise raise aString raise thing [, aString [ aStackTrace ] ] |
$!
på nytt eller et nytt
RuntimeError
-unntak
dersom $!
er nil
.
Den andre varianten lager et nytt RuntimeError
-unntak
med den angitte strengen som feilmelding.
Den tredje varianten lager et unntaksobjekt ved å kalle metoden
exception
på det første argumentet. Deretter
settes dette unntakets melding og stakkhistorikk lik henholdsvis andre
og tredje argument.
Klassen Exception
og
objekter av klassen Exception
inneholder factory-metoder kalt exception
, slik at
klassenavnet til, eller en instans av, et unntak kan brukes som første
parameter til raise
.
Når et unntak heves, plasserer Ruby en referanse til
Exception
-objeket i den globale
variabelen $!
.
begin
/end
-blokk.
begin code... code... [rescue [parm]* [=> var ] [then] error handling code... ]* [else no exception code... ] [ensure always executed code... ] end |
rescue
-klausuler, og hver
rescue
kan spesifisere null eller flere parametre.
En rescue
-klausul uten parametre behandles som om den hadde en
parameter; StandardError
.
Når et unntak heves, søker Ruby opp gjennom kallstakken til den finner
en omsluttende begin
/end
-blokk. Deretter sammenligner Ruby
unntaket med rescue
-klausulenes parameter i tur og orden.
Hver parameter sammenlignes med $!.kind_of?(parameter)
.
Dersom det hevede unntaket passer med en rescue
-klausul så
utfører Ruby kroppen til den klausulen og stopper søket.
Dersom en rescue
-klausul som slår til slutter med
=>
og et variabelnavn, så settes den variabelen til $!
.
Selv om parameterne til rescue
-klausuler vanligvis er navn på
Exception
-klasser, så kan de være vilkårlige
uttrykk (også metodekall) som returnerer en passende klasse.
Dersom ingen av rescue
-klausulene passer med det hevede unntaket,
beveger Ruby seg oppover i kallstakken på utkikk etter en
begin
/end
-glokk på et høyere nivå med en klausul som passer.
Dersom ett unntak kommer seg helt opp på toppnivå uten å bli fanget opp av en
rescue
vil programmet termineres med en feilmelding.
Dersom det er en else
-klausul tilstede vil kroppen dens
bli utført dersom ingen unntak ble hevet i den
opprinnelige koden. Unntakt som heves i
else
-klausulen blir ikke fanget av rescue
-klasulene
som er i samme blokk som else
-klausulen.
Hvis det er en ensure
-klausul vil dens kropp alltid bli
utført når blokken avsluttes (selv om et uhåndtert unntak er i ferd med
å bli sendt oppover kallstakken).
retry
i fra en rescue
-klausul kan
man starte den omliggende begin
/end
-blokken på nytt
fra begynnelsen.
Kernel::catch
utfører den assosierte blokken.
catch ( aSymbol | aString ) do block... end |
Kernel::throw
avbryter den normale prosesseringen.
throw( aSymbol | aString [, anObject ] ) |
throw
utføres, søker Ruby oppover i kallstakken etter
den første catch
-blokken med et symbol eller en streng som
passer. Dersom Ruby finner en passende catch
-blokk, stopper
søket og utførselen fortsetter etter slutten på catch
-blokken.
Hvis det var gitt en parameter til throw
-kallet, vil
den brukes som returverdi fra catch
-blokken.
Ruby vil oppfylle eventuelle ensure
-klausuler i blokkuttrykken som
den traverserer i søken etter en korresponderende catch
.
Dersom ingen catch
-blokk passer til throw
-utsagne, vil
Ruby heve et NameError
-unntak med utgangspunkt der
throw
ble kalt.
( In progress translation to Norwegian by NorwayRUG. $Revision: 1.18 $ )
$Log: language.xml,v $ Revision 1.18 2003/08/04 16:07:10 kent Første utkast til language.
Forrige < |
Innhold ^
|
Neste >
|