Ruby är ett av de mest populära språk som används på webben. Vi har startat en ny screencast-serie här på Nettuts + som kommer att introducera dig till Ruby, liksom de stora ramar och verktyg som följer med Ruby-utvecklingen. I det här kapitlet ser vi på hur villkorade uttalanden och loopar fungerar i Ruby.
Om uttalandet är en av de första typerna av förgrening du lär dig när du programmerar. Du kan gissa vad det betyder: om det är sant, gör en sak; om inte, gör något annat. I Ruby är dessa ganska lätta att skriva:
namn = "Andrew" om namn == "Andrew" sätter "Hello Andrew" slutet om namnet == "Andrew" sätter "Hello Andrew" annars sätter "Hej någon annan" slutar
Efter sökordet om
, kod i ditt villkorat uttalande. Därefter kommer koden att utföras om villkoret returneras sant. Du stänger uttalandet med slutet
nyckelord. Om du vill kan du klämma en annan
uttalande där inne, vilket förutsägbart kommer att utföras om villkoret är felaktigt.
Det är inte svårt att kontrollera efter flera villkor. Ställ bara så många elsif
uttalanden som du vill ha mellan om
och annan
uttalanden. Ja det är elsif
, ett äktenskap av annan
och om
.
order = : size => "medium" def make_medium_cofee sätter "making medium statement" avsluta #assume andra funktioner om order [: size] == "small" make_small_coffee; elsif order [: size] == "medium" make_medium_coffee; elsif order [: size] == "large" make_large_coffee; annars make_coffee; slutet
Som jag nämnde kan du få så många elsif
villkor och deras motsvarande kodblock som du vill.
De flesta programmeringsspråk gör skillnad mellan uttalanden och uttryck. En uttalande är en kodkonstruktion som inte utvärderar till ett visst värde. Ett uttryck är en kodkonstruktion gör returnera ett värde. Till exempel kallar en funktion ett uttryck, eftersom det returnerar ett värde. Men om ett uttalande är exakt det, ett uttalande, eftersom det inte returnerar ett värde. Det betyder att du inte kan göra detta i JavaScript:
message = if (someTruthyValue) "detta är sant"; annars "detta är falskt";
Självklart kan du inte göra detta eftersom if-satsen inte returnerar ett värde som du kan tilldela meddelande
.
Du kan dock göra detta med Ruby, eftersom uttalanden är egentligen uttryck, vilket betyder att de returnerar ett värde. Så vi kan göra det här
meddelande = om order [: size] == "small" "gör en liten" elsif order [: size] == "medium" "gör ett medium" annars "gör kaffe" slut
Vilket koden som helst exekveras blir värdet av meddelande
.
Om du inte har något elsif
eller annan
klausuler, och ditt if-utlåtande har bara en rad, du kan använda den som modifierare till en "normal" linje.
sätter "gör kaffe" om customer.would_like_coffee?
I de flesta programmeringsspråk vill vi vända tillbaka det betingade uttrycket, vi måste negera det, vanligtvis med banget (!
) operatör.
engine_on = true if! engine_on # betyder "om inte engine_on" sätter "service engine" # should not be put, eftersom "inte engine_on" är falsk ände
Ruby har emellertid ett riktigt trevligt såvida inte
operatör, som hindrar oss från att behöva göra det, samtidigt som vi ger oss mycket mer läsbar kod:
om inte engine_on # "såvida inte engine_on" är bättre än "om inte engine_on" "servicing engine" slutar
Precis som om
, du kan använda såvida inte
som modifierare:
sätter "service engine" såvida inte motor_on
Om du har många alternativ att arbeta igenom, använder du Om / elsif / annat
kan vara något wordy. Prova ärendet.
timme = 15 fall när timme < 12 puts "Good Morning" when hour > 12 && timme < 17 puts "Good Afternoon" else puts "Good Evening" end
Det är kinda-sorta-kanske som a switch fallet
uttalande i JavaScript (eller andra språk), förutom att det inte finns någon variabel du utvärderar. Inuti fall / slut
nyckelord, du kan lägga så många när
uttalanden som du skulle vilja. Följ det här när
genom det villkorliga uttrycket, och sedan går kodens linjer efter det. Precis som if-uttalandet är fallet uttalandet verkligen ett uttryck, så du kan tilldela det ett uttryck och fånga ett returvärde.
timme = 15 meddelande = fall när timme < 12 "Good Morning" when hour > 12 && timme < 17 "Good Afternoon" else "Good Evening" end puts message
Om du är bekant med JavaScript vet du att blocken av kod i ett if-uttalande är omgivna av lockiga hängslen. Vi gör det inte i Ruby, så det kan tyckas att Ruby är beroende av vittområdet. Ingenting kan vara längre från sanningen (ta det, pythonistas :)).
Om vi vill skriva dina uttalanden som en-liners, måste du skilja de olika delarna av de uttalandena ... men hur? Tja, du kan använda halvkolonor:
om namnet == "Andrew"; some_code; annan; some_code; slutet
Om du inte gillar utseendet på det (vilket jag inte gör) kan du lägga sökordet sedan
mellan de villkorliga uttrycken och kodens linje.
om namnet == "Andrew" då sode_code; slutet
Detta fungerar också för ett fallutlåtande.
fallet när x> 20; sätter "<20" when x < 20 then puts "<20" end
Så, det är villkorliga uttalanden (jag menar, uttryck). Vad sägs om loopar? Låt oss titta på medan slingorna först.
En stundslinga fortsätter att utföras tills det angivna tillståndet är falskt:
ar = ["John", "George", "Paul", "Ringo"] i = 0 medan arr [i] sätter ar [i] i + = 1 slutet
Här slingar vi över en matris; när arr [i]
returnerar false (vilket betyder att det inte finns några objekt kvar i matrisen), kommer slingan sluta att köras. Inuti slingan skriver vi ut det aktuella objektet i matrisen, och de lägger till en till vår inkrementvariabel.
Du kan också använda medan
som modifierare
ar = ["John", "George", "Paul", "Ringo"] i = -1 sätter ar [i + = 1] medan arr [i]
Precis som såvida inte
är motsatsen till om
, fram tills
är motsatsen till medan
. Det fortsätter att slinga tills tillståndet är sant:
days_left = 7; tills days_left == 0 sätter "det finns fortfarande # days_left i veckan" days_left - = 1 end
Och det är självklart också en modifierare.
days_left = 8 sätter "det finns fortfarande # days_left - = 1 i veckan" tills days_left == 1
Ja Ruby har en för loop. Nej, det är inte som för loop på andra språk. Det verkar som en slinga för att slingra över värdena i en array eller hash:
ar = ["John", "George", "Paul", "Ringo"] för objekt i aren sätter punktänden
Om du loopar över en hash kan du använda två variabla namn, en för nyckeln och en för värdet:
joe = : name => "Joe",: ålder => 30,: jobb => "rörmokare" för nyckel, val i joe sätter "# key är # val" slutet
Jag hoppas att du njuter av vår Ruby for Newbies Screencast-serie. Om det finns något du skulle vilja se, låt mig veta i kommentarerna! (Och om du inte tittar på videoklippen, borde du vara. Det finns bara en screencast-bonus i slutet av var och en.)