|
|||
Forrige < |
Innhold ^
|
Neste >
|
def
. Navn på metoder bør begynne med en liten forbokstav.
[
Du får ikke umiddelbart en feil hvis du bruker en stor forbokstav, men når
Ruby ser deg kalle metoden, vil den først gjette seg til at det er en konstant, og ikke et metode kall. Dette kan resultere i at Ruby tolker kallet feil.
]
Metoder som spør om noe, gis ofte et navn med et ``?
''-tegn på slutten, som for eksempel instance_of?
. Metoder som er ``farlige'' eller endrer objektet de kalles på, kan få et navn som slutter med ``!
''. Et eksempel er String
som både har en chop
og en chop!
metode. Den første returnerer en modifisert streng, mens den andre modifiserer selve mottakerstrengen. ``?
'' og ``!
'' er de eneste merkelige tegnene som metoder kan ha som suffiks.
Når vi har fått angitt et navn til vår nye metode, trenger vi kanksje å
deklarere noen parametre. Vi skriver bare en liste av lokale variabelnavn i mellom parenteser. Noen eksempler på metodedeklarasjoner:
def myNewMethod(arg1, arg2, arg3) # 3 argumenter # Koden til den nye metoden skrives her end def myOtherNewMethod # Ingen argumenter # Koden til den nye metoden skrives her end |
def coolDude(arg1="Miles", arg2="Coltrane", arg3="Roach")
|
||
"#{arg1}, #{arg2}, #{arg3}."
|
||
end
|
||
|
||
coolDude
|
» |
"Miles, Coltrane, Roach."
|
coolDude("Bart")
|
» |
"Bart, Coltrane, Roach."
|
coolDude("Bart", "Elwood")
|
» |
"Bart, Elwood, Roach."
|
coolDude("Bart", "Elwood", "Linus")
|
» |
"Bart, Elwood, Linus."
|
return
uttrykk.
def varargs(arg1, *rest)
|
||
"Got #{arg1} and #{rest.join(', ')}"
|
||
end
|
||
|
||
varargs("one")
|
» |
"Got one and "
|
varargs("one", "two")
|
» |
"Got one and two"
|
varargs "one", "two", "three"
|
» |
"Got one and two, three"
|
Array
, som så tilordnes til den parameteren.
yield
.
def takeBlock(p1) if block_given? yield(p1) else p1 end end |
takeBlock("no block")
|
» |
"no block"
|
takeBlock("no block") { |s| s.sub(/no /, '') }
|
» |
"block"
|
&
''),
bli blokken som assosieres med metodekallet omgjort til et Proc
-objekt, som så tilordnes til den parameteren.
class TaxCalculator
|
||
def initialize(name, &block)
|
||
@name, @block = name, block
|
||
end
|
||
def getTax(amount)
|
||
"#@name on #{amount} = #{ @block.call(amount) }"
|
||
end
|
||
end
|
||
|
||
tc = TaxCalculator.new("Sales tax") { |amt| amt * 0.075 }
|
||
|
||
tc.getTax(100)
|
» |
"Sales tax on 100 = 7.5"
|
tc.getTax(250)
|
» |
"Sales tax on 250 = 18.75"
|
connection.downloadMP3("jitterbug") { |p| showProgress(p) } |
connection
mottakeren,
downloadMP3
er navnet til metoden,
"jitterbug"
er en parameter og greiene mellom klammeparentesene er
den tilknyttede blokken.
For klasse- eller modulmetoder, vil mottakeren være klasse- eller modulnavnet.
File.size("testfile") Math.sin(Math::PI/4) |
self
, det gjeldende objektet.
self.id
|
» |
537790064
|
id
|
» |
537790064
|
self.type
|
» |
Object
|
type
|
» |
Object
|
a = obj.hash # Same as a = obj.hash() # this. obj.someMethod "Arg1", arg2, arg3 # Same thing as obj.someMethod("Arg1", arg2, arg3) # with parentheses. |
def five(a, b, c, d, e)
|
||
"I was passed #{a} #{b} #{c} #{d} #{e}"
|
||
end
|
||
|
||
five(1, 2, 3, 4, 5 )
|
» |
"I was passed 1 2 3 4 5"
|
five(1, 2, 3, *['a', 'b'])
|
» |
"I was passed 1 2 3 a b"
|
five(*(10..14).to_a)
|
» |
"I was passed 10 11 12 13 14"
|
listBones("aardvark") do |aBone| # ... end |
if
eller while
-setning.
Men av og til ønsker du mer fleksibilitet.
Som eksempel, hvis vi holder på å lære bort matematikk.
[
Selvfølgelig ville Andy og Dave måtte lære seg matematikk først.
Conrad Schneiker minnet oss om at det finnes tre typer mennesker: de som kan regne og de som ikke kan.
]
En student kunne be om en n-pluss tabell eller en n-gange tabell. Hvis studenten ber om en tabell med to-gangen, ville vi printet ut 2, 4, 6, 8 og så videre. (Denne koden sjekker ikke innput for feil.)
print "(t)imes or (p)lus: " times = gets print "number: " number = gets.to_i if times =~ /^t/ puts((1..10).collect { |n| n*number }.join(", ")) else puts((1..10).collect { |n| n+number }.join(", ")) end |
(t)imes or (p)lus: t number: 2 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 |
if
-setningen. Det ville vært kjekt om vi kunne faktorisere ut blokken som gjør utregningen.
print "(t)imes or (p)lus: " times = gets print "number: " number = gets.to_i if times =~ /^t/ calc = proc { |n| n*number } else calc = proc { |n| n+number } end puts((1..10).collect(&calc).join(", ")) |
(t)imes or (p)lus: t number: 2 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 |
Proc
-objekt. Ruby fjerner det fra parameterlisten, gjør Proc
-objektet om til en blokk og tilknytter den til metodekallet.
Denne teknikken kan også brukes til å strø litt syntaktisk sukker over blokkbruken din. For eksempel, noen ganger ønsker du å ta en iterator og lagre hver verdi den sender ut via yield
og samle det i en tabell.
Her gjenbruker vi Fibonacci nummergeneratoren fra side 40(??).
a = []
|
||
fibUpTo(20) { |val| a << val }
|
» |
nil
|
a.inspect
|
» |
"[1, 1, 2, 3, 5, 8, 13]"
|
into
, som returnerer blokken som fyller tabellen.
(Legg merke til at blokken som returneres egentlig er en tillukkning---den holder en referanse til parameteren anArray selv etter at into
har returnert.)
def into(anArray)
|
||
return proc { |val| anArray << val }
|
||
end
|
||
|
||
fibUpTo 20, &into(a = [])
|
||
a.inspect
|
» |
"[1, 1, 2, 3, 5, 8, 13]"
|
SongList
klassen vår.
class SongList def createSearch(name, params) # ... end end aList.createSearch("short jazz songs", { 'genre' => "jazz", 'durationLessThan' => 270 } ) |
=>
verdi par i en argumentliste, forutsatt at de kommer etter normale parametre og før tabell- og blokkargumenter. Alle disse parene vil bli samlet inn i en enkelt hashtabell og
sendt inn som et argument til metoden. Klammeparenteser er helt unødvendig.
aList.createSearch("short jazz songs", 'genre' => "jazz", 'durationLessThan' => 270 ) |
Forrige < |
Innhold ^
|
Neste >
|