A tartományok két érték közötti intervallumot jelölnek.
A leggyakrabban használt, tartományokat támogató típusok az Int, a Char és a String.
Sok mindenre használhatók, például gyűjtemények gyors létrehozására, stringek szeletelésére, annak ellenőrzésére, hogy egy érték benne van-e egy tartományban, és iterációra.
A .. vagy a ... tartományoperátorral hozhatók létre (előbbi zárt, utóbbi nyílt).
1..5 # A range containing 1, 2, 3, 4, 5
1...5 # A range containing 1, 2, 3, 4
Azért van két tartományoperátor, hogy olyan tartományokat hozhass létre, amelyek tartalmazzák vagy nem tartalmazzák a végértéket. Ez hasznos lehet például akkor, ha nullától kezdődő indexekkel dolgozol.
A tartományokat a Range kezdőértékével is létrehozhatod.
Range.new(1, 5) # A range containing 1, 2, 3, 4, 5
Amikor Crystalkan a .. vagy a ... tartományoperátorral hozol létre egy tartományt, és metódust szeretnél meghívni rajta, zárójelbe kell tenned a tartományt.
Ellenkező esetben ugyanis a metódus a tartományoperátor második argumentumán hívódna meg.
(1..5).size # => 5
1..5.size # => Error: undefined method 'size' for Int32
Ha egy stringet szeretnél szeletelni, a tartományoperátorral részstringet kaphatsz. Ehhez olyan tartományt hozz létre, amely a részstring kezdő- és záróindexét adja meg.
"Hello World"[0..4] # => "Hello"
"Hello World"[6..10] # => "World"
Negatív indexekkel a string végétől is kinyerheted a részstringet.
"Hello World"[-5..-1] # => "World"
"Hello World"[6..-4] # => "Wo"
A tartományoknak van egy sor metódusa, amelyekkel dolgozhatsz rajtuk. Ezekkel például megkaphatod a tartomány összes értékének összegét, vagy ellenőrizheted, hogy a tartomány tartalmaz-e egy értéket.
| Method | Description | Example |
|---|---|---|
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 |
includes? |
true-t ad vissza, ha a tartomány tartalmazza a megadott értéket, egyébként false-t |
(1..5).includes?(3) # => true |
Egy tartomány lehet végtelen és kezdet nélküli.
A végtelen vagy kezdet nélküli tartománynál a kezdő- vagy a végérték nil, de a nil el is hagyható a tartomány megadásakor.
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 szeletelni.
"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, ha nem bánsz vele óvatosan.
Char típusú tartományokA Char értékek is használhatók tartományokban, így két karakter közötti karakterintervallumot kapsz.
Ez például akkor hasznos, ha az ábécét szeretnéd megkapni.
'a'..'z' # A range containing ['a', 'b', 'c', ..., 'z']
A stringek is használhatók tartományokban, így két string közötti stringintervallumot kaphatsz.
A viselkedésük azonban némileg eltér a Char-tól, ha több karaktert használsz egy stringtartományban.
Bonyolultabb stringtartományoknál a viselkedés zavaróvá válhat, ezért légy óvatos.
("aa".."az") # A range containing ["aa", "ab", "ac", ..., "az"]
Sakkrajongóként a játék saját változatát szeretnéd megírni. Igaz, máris rengeteg sakkmegvalósítás elérhető online, de a tiéd egyedi lesz!
A bábuk alapvető mozgatási rendszerének megvalósításával kezded.
A sakkjátszma egy nyolc mező széles és nyolc mező hosszú táblán zajlik majd. 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 vonalai, é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 vonalai, és az A-tól H-ig terjedő betűk jelölik őket.
Definiáld a Chess::RANKS és Chess::FILES konstansokat, amelyek rendre a sorok és 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 az oszlopok tartományán belül van.
Definiáld a Chess.valid_square? metódust, amely két argumentumot kap: rank a mező sorát tárolja egész számként, file pedig az oszlopát karakterként.
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ő két karaktere és a vezetéknevének utolsó két karaktere. A becenevet nagybetűvel kell írni.
Definiáld a Chess.nickname metódust, amely a first_name és a last_name argumentumot kapja: first_name a játékos keresztnevét, last_name pedig a vezetéknevét tartalmazó string.
A metódus a játékos becenevét nagybetűs stringként adja vissza.
Chess.nickname("John", "Doe")
# => "JOOE"
A játéknak üzenetet kell létrehoznia egy lépéshez, hogy megmondja, melyik játékos melyik mezőre lépett. Az üzenetben a játékos beceneve és a mező szerepel, amelyre lépett. A játéknak azt is meg kell határoznia, hogy a lépés érvényes-e, 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, amely a first_name, a last_name és a square argumentumot kapja: first_name a játékos keresztnevét, last_name a vezetéknevét, square pedig a mezőt tartalmazó string, amelyre a játékos lépett.
A metódus a lépés üzenetét adja vissza 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) Crystal nyelvet 26 fogalom142 feladat segítségével, valódi emberi mentorálással, mindez ingyen.