A tartományok két érték közötti intervallumot jelölnek.
A leggyakoribb típusok, amelyek támogatják a tartományokat, az Integer és a String.
Sok mindenre használhatók: gyorsan létrehozhatsz velük egy gyűjteményt, feldarabolhatsz stringeket, ellenőrizheted, hogy egy érték benne van-e egy tartományban, vagy iterálhatsz.
A .. vagy a ... tartományoperátorral hozhatók létre (előbbi a záróértéket is beleérti, utóbbi nem).
1..5 # => 1..5
1...5 # => 1...5
(1..5).to_a # => [1, 2, 3, 4, 5]
(1...5).to_a # => [1, 2, 3, 4]
Azért van két tartományoperátor, hogy olyan tartományokat is létrehozhass, amelyek tartalmazzák a záróértéket, vagy épp nem. Ez hasznos lehet például a nullától indexelt tömbökkel való munka során.
Tartományokat a Range konstruktorral, a new metódussal is létrehozhatsz.
Range.new(1, 5) # A range containing 1, 2, 3, 4, 5
Amikor Rubyban a .. vagy ... operátorral hozol létre egy tartományt, és metódust szeretnél hívni rajta, zárójelbe kell tenned a tartományt.
Ennek az az oka, hogy különben a metódus a tartományoperátor második argumentumán hívódik meg.
(1..5).sum # => 15
1..5.sum # => Error: undefined method `sum' for 5:Integer (NoMethodError)
Ha egy stringből részstringet szeretnél kivágni, a tartományoperátorral is megkaphatod. Ehhez a részstring kezdő- és végindexével hozol létre egy tartományt.
"Hello World"[0..4] # => "Hello"
"Hello World"[6..10] # => "World"
Negatív indexekkel a string végéről is kinyerhetsz részstringet.
"Hello World"[-5..-1] # => "World"
"Hello World"[6..-4] # => "Wo"
A tartományoknak van egy sor metódusuk, amelyekkel dolgozhatsz velük. Ezekkel például kiszámíthatod a tartomány összes értékének összegét, vagy ellenőrizheted, hogy a tartomány tartalmaz-e egy értéket.
| Metódus | Leírás | Példa |
|---|---|---|
sum |
A tartomány összes értékének összegét adja vissza | (1..5).sum # => 15 |
size |
A tartomány méretét adja vissza | (1..5).size # => 5 |
include? |
true-t ad vissza, ha a tartomány tartalmazza a megadott értéket, egyébként false-t |
(1..5).include?(3) # => true |
Egy tartomány lehet végtelen és kezdet nélküli is.
A végtelen vagy kezdet nélküli tartománynál a kezdő- vagy végérték nil, de a tartomány definiálásakor a nil elhagyható.
A kezdet nélküli és végtelen tartományok akkor hasznosak, ha például egy stringet az elejétől vagy a végéig szeretnél feldarabolni.
"Hello World"[0..] # => "Hello World"
"Hello World"[4..] # => "o World"
"Hello World"[..5] # => "Hello "
Ha nem gyűjteményen használod, a végtelen tartomány végtelen sorozatot eredményezhet, ezért óvatosan bánj vele.
A stringek tartományokban is használhatók, így két string közötti stringek intervallumát kaphatod meg. Bizonyos stringekkel a viselkedése kissé váratlan lehet, ezért óvatosan használd.
("aa".."az").to_a # => ["aa", "ab", "ac", ..., "az"]
Sakkrajongóként szeretnéd megírni a játék saját változatát. Persze, lehet, hogy már rengeteg sakkimplementáció elérhető az interneten, de a tiéd egyedi lesz!
A bábuk alapvető mozgatási rendszerének megvalósításával kezdesz.
A sakkjáték egy 8 mező széles és 8 mező hosszú táblán zajlik. A mezőket egy betű és egy szám azonosítja.
A játéknak tárolnia kell a tábla sorait. A sorok a tábla vízszintes sorai, és 1-től 8-ig vannak számozva.
A játéknak a tábla oszlopait is tárolnia kell. Az oszlopok a tábla függőleges oszlopai, amelyeket A-tól H-ig terjedő betűk azonosítanak.
Definiáld a Chess::RANKS és Chess::FILES konstansokat, amelyek a sorok, illetve az oszlopok tartományát tárolják.
Chess::RANKS
# => 1..8
Chess::FILES
# => 'A'..'H'
A játéknak ellenőriznie kell, hogy egy mező érvényes-e. Egy mező akkor érvényes, ha a sora és az oszlopa a sorok és oszlopok tartományán belül van.
Definiáld a Chess.valid_square? metódust, amelynek rank argumentuma a sor számát tartalmazó egész szám, file argumentuma pedig az oszlop betűjét tartalmazó karakter.
A metódus adjon vissza true-t, ha a sor és az oszlop a sorok és oszlopok tartományán belül van, egyébként pedig false-t.
Chess.valid_square?(1, 'A')
# => true
A játéknak le kell kérnie a játékos becenevét. A becenév a játékos keresztnevének első 2 karakteréből és a vezetéknevének utolsó 2 karakteréből áll. A becenevet csupa nagybetűvel kell írni.
Definiáld a Chess.nickname metódust, amelynek first_name argumentuma a játékos keresztnevét tartalmazó string, last_name argumentuma pedig a vezetéknevét tartalmazó string.
A metódus adja vissza a játékos becenevét csupa nagybetűs stringként.
Chess.nickname("John", "Doe")
# => "JOOE"
A játéknak létre kell hoznia egy üzenetet egy lépéshez, amely megmondja, melyik játékos melyik mezőre lépett. Az üzenet a játékos becenevét és a mezőt használja, amelyre lépett. A játéknak azt is meg kell határoznia, hogy érvényes-e a lépés, mégpedig úgy, hogy ellenőrzi: a mező oszlopa és sora a sorok és oszlopok tartományán belül van-e.
Ha a lépés érvényes, az üzenet ez legyen: "{nickname} moved to {square}"
Ha a lépés érvénytelen, az üzenet ez legyen: "{nickname} attempted to move to {square}, but that is not a valid square"
Definiáld a Chess.move_message metódust, amelynek first_name argumentuma a játékos keresztnevét tartalmazó string, last_name argumentuma a vezetéknevét tartalmazó string, square argumentuma pedig annak a mezőnek a stringje, amelyre a játékos lépett.
A metódus adja vissza a lépés üzenetét stringként.
Chess.move_message("John", "Doe", "A1")
# => "JOOE moved to A1"
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Ruby nyelvet 21 fogalom121 feladat segítségével, valódi emberi mentorálással, mindez ingyen.