6. Syntax
6.1 Wat betekend :var
?
Een dubble punt gevolgd door een naam genereerd een integer(Fixnum)
genaamd
een symbol wat een op een correspondeerd met de identifier."var".intern
levert de zelfde integer op als:var
, maar de ``:'' vorm
maakt
een locaal symbol aan als dit nog niet bestaat.
De routines "catch", "throw", "autoload" etc., vragen een string of een symbol als prarameter.
"method_missing", "method_added" en "singleton_method_added" (en andere) vragen een symbol.
Dat een symbol ontstaat op het moment dat er voor de eerste keer aan word gerefereerd word soms gebruikt om een unieke waarde aan constanten toe te kennen:
NORTH = :NORTH |
6.2 Hoe krijg ik de waarde van een symbol?
Om de waarde van de met een symbol corresponderende variabele op te
vragen
gebruik je id2name
om de naam van de variabele te
krijgen.
Die naam eval
daarna om de waarde van de variable te
krijgen.
In de scope van "symbol", doe je eval(:symbol.id2name)
.
a = 'This is the content of "a"' |
Als je symbol correspondeed met de naam van een methode kan je de Method.method
functie gebruiken om een Method
object terug te krijgen,
wat
je daarna kan aanroepen.
class Demo |
6.3 Is loop
een control structure?
Hoewel loop
op een control structure lijkt, is het een
method
Kernel
gedefinieerde methode. Het block wat de aanroep
volgt
introduceerd een nieuwe scope voor locale variabelen.
6.4 Heeft Ruby geen post-test loop?
Vraag: Ruby heeft geen do { ... } while
constructie,
hoe kan ik een loop maken die de conditie op het eind test?
Clemens Hintze zegt: Je kan een combinatie van Ruby's begin
... end
en de while
of until
statement modifiers
gebruiken om het zelfde effect te bereiken:
i = 0 |
6.5 a +b
geeft een fout!
Ruby probeert om onderscheid te maken tussen methode aanroepen en
operatorsen
tussen variabele namen en methode namen. Helaas lukt dit niet altijd.
Dit
geval, ``a +b
'', word geparsed als ``a(+b)
''.
Als je de spatie links van de ``+
'' verwijderd of
rechts
van de ``+
'' een spatie plaatst zal de expressie als
optelling
worden geparsed.
6.6 s = "x"; puts s *10
geeft een fout!
Nogmaal, Ruby ziet de niet-symmetrische spatie en parsed als puts(s(*10))
(niet zo slim eigenlijk). Gebruik ``s*10
'' of ``s * 10
''
voor het gewenste resultaat.
6.7 Waarom kan ik geen hash literal doorgeven aan
een methode: p {}
?De
De {}
word geparsed als een block, niet als een Hash
constructor.
Je kan ervoor zorgen dat {}
gezien wordt als een
expressie door
het expliciet te noteren als parameter: p({})
.
6.8 Ik krijg def pos=(val)
niet werkend!
Ik heb de volgende code, maar de method pos = 1
werkt niet.
def pos=(val) |
Methodes met =
moeten worden aangeroepen met een
ontvanger
(zonder ontvanger doe je gewoon een toekenning aan een locale
variabele).
Roep de methode aan als: self.pos = 1
.
6.9 Wat is het verschil tussen \1'
and
'\\1'
?
Ze hebben de zelfde betekenis. in een string met enkele quote worden
alleen
\'
en \\
omgezet en blijven alle andere
combinaties
onveranderd.
Echter, in een string met dubbele quotes, is "\1"
de
byte\001
,
terwijl "\\1"
de string van twee karakters is sie een
backslash
en het teken "1" bevat.
6.10 Wat is het verschil tussen ``or
''
and ``||
''?
Vraag: ``p(nil || "Hello")
'' print "Hello",
terwijl
``p(nil or "Hello")
'' een parse fout geeft.
Antwoord: ||
combineerd de termen binnen een
expressie.
Ondeat de eerste term in dit geval nil
is, word de tweede
term
geevalueerd.
or
word gebruikt om expressies in condities te
combineren.
Ruby verwacht geen conditie in een lijst met parameters.