The Object-Oriented Programming Language RubyDe Nederlandse Ruby Homepage




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
SOUTH = :SOUTH
EAST = :EAST
WEST = :WEST

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"'
b = eval(:a.id2name)
a.id == b.id # b now references the same object as 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
def meth
"Hello, world"
end
end

d = Demo.new # -> #<Demo:0x401b498c>
m = d.method(:meth) # -> #<Method: Demo(Demo)#meth>
m.call # -> "Hello, world"

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
begin
puts "i = #{i}"
i += 1
end until i > 4

Produces:

i = 0
i = 1
i = 2
i = 3
i = 4

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)
print @pos, "\n"
@pos = val
end

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.