Ruby/Powrót do prostych przykładów: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Kj (dyskusja | edycje)
m +nav
Linia 22:
<pre>def fact(n)</pre>
 
W pierwszej linii, '''def''' jest instrukcją służącą do definiowania funkcji (lub, bardziej precyzyjnie, metody; będziemy rozmawiać więcej o tym czym jest metoda w dalszym rozdziale). Tutaj, '''def''' wskazuje, że funkcja przyjmuje pojedynczy argument, nazwany '''n'''.
 
<pre>if n == 0</pre>
 
'''if''' służy do sprawdzania warunku. Kiedy warunek jest spełniony, następny fragment kodu jest obliczany; kiedy nie jest, obliczane jest cokolwiek co występuje za '''else'''.
 
<pre>1</pre>
 
Wartość '''if''' wynosi 1 jeżeli warunek jest spełniony.
 
<pre>else</pre>
 
Jeżeli warunek nie jest spełniony, obliczany jest kod znajdujący się od tego miejsca do '''end'' jest obliczany'.
 
<pre>n * fact(n-1)</pre>
 
Jeżeli warunek nie jest spełniony, wartość wyrażenia '''if''' wynosi '''n''' razy '''fact(n-1)'''.
 
<pre>end</pre>
 
Pierwszy '''end''' zamyka instrukcję '''if'''.
 
<pre>end</pre>
 
Drugi '''end''' zamyka instrukcję '''def'''.
 
<pre>puts fact(ARGV[0].to_i)</pre>
 
Ta linia wywołuje naszą funkcję '''fact()''' używając wartości z linii poleceń oraz wypisuje wynik.
 
'''ARGV''' jest tablicą, która zawiera argumenty z linii poleceń. Elementy '''ARGV''' są łańcuchami znakowymi, więc aby dokonać konwersji na liczby całkowite używamy metody '''to_i'''. Ruby nie zamienia łańcuchów na liczby automatycznie tak jak Perl.
''ARGV'' is an array which contains command line arguments. The members of ARGV are strings, so we must convert this into a integral number by to_i. Ruby does not convert strings into integers automatically like perl does.
 
Co się stanie jeśli podamy naszemu programowi liczbę ujemną? Widzisz problem? Umiesz go rozwiązać?
What would happen if we fed this program a negative number? Do you see the problem? Can you fix it?
Strings
 
=== Łańcuchy znakowe ===
Next we examine the puzzle program from the chapter on strings. As this is somewhat longer, we number the lines for reference.
 
Teraz zbadamy nasz program - łamigłówkę z rozdziału o [[Ruby/Łańcuchy znakowe|łańcuchach znakowych]]. Ponieważ jest on nieco długi, ponumerujmy linie by móc się łatwo do nich odnieść.
 
<pre>
01 words = ['foobar', 'baz', 'quux']
02 secret = words[rand(3)]
Linia 74 ⟶ 76:
14 end
15 puts "the word is ", secret, "."
</pre>
 
InW thistym program,programie ajest newużyta controlnowa structure,struktura while,sterująca is- used'''while'''. TheKod code betweenpomiędzy '''while''' and itsjej correspondingkończącym '''end''' willbędzie executewykonywany repeatedlyw aspętli longtak asdługo somejak specifiedpewien conditionokreślony remainswarunek truepozostanie prawdziwy. InW thistym case,przypadku '''guess=STDIN.gets''' isjest bothzarówno anaktywną active statementinstrukcją (collectingpobierającą alinię linewejściową ofod userużytkownika inputi andzachowującą storing it asjako '''guess'''), andoraz a conditionwarunkiem (ifjeżeli therenie isma nożadnego inputwejścia, '''guess''', whichktóre repesentsreprezentuje thewartość valuecałego of the wholewyrażenia '''guess=STDIN.gets expression''', hasbędzie amiało nilwartość value'''nil''', causingktóra whilespowoduje toprzerwanie stoppętli looping'''while''').
 
'''STDIN''' isoznacza theobiekt standardstandardowego input objectwejścia. UsuallyZwykle, '''guess=gets''' does therobi sameto thingsamo asco '''guess=STDIN.gets'''.
 
'''rand(3)''' inw linelinii 2 returnszwraca alosową randomliczbę numberw inprzedziale the rangeod 0 todo 2. This random number isTa usedlosowa toliczba extractjest oneużyta ofdo thewyciągnięcia membersjednego ofelementu thez arraytablicy '''words'''.
 
InW linelinii 5 weczytamy readjedną onelinię lineze fromstandardowego standardwejścia inputprzez by the methodmetodę '''STDIN.gets'''. If EOF (end of file) occurs while getting the line, gets returns nil. So the code associated with this while will repeat until it sees ^D (try ^Z or F6 under DOS/Windows), signifying the end of input.
 
guess.chop! in line 6 deletes the last character from guess; in this case it will always be a newline character, gets includes that character to reflect the user's Return keystroke, but we're not interested in it.