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, például gyorsan létrehozhatsz velük egy gyűjteményt, szeletelhetsz karakterláncokat, ellenőrizheted, hogy egy érték benne van-e egy tartományban, és iterálhatsz velük.
A .. vagy a ... tartományoperátorral hozod létre őket (előbbi a végértéket is magában foglalja, 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 létrehozhass olyan tartományokat, amelyek magukban foglalják a végértéket, vagy épp nem, ami hasznos lehet például nulla alapú indexekkel való munka során.
Tartományokat a Range kezdőértékével 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 meghí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ódna meg.
(1..5).sum # => 15
1..5.sum # => Error: undefined method `sum' for 5:Integer (NoMethodError)
Amikor egy karakterláncot szeretnél szeletelni, a tartományoperátorral kinyerhetsz egy részstringet. 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 karakterlánc végéről is kinyerheted a 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ámolhatod 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 |
A tartomány lehet végtelen és kezdet nélküli.
A végtelen vagy kezdet nélküli tartomány kezdő- vagy végértéke 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 karakterláncot 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 egy gyűjteményen használod, a végtelen tartomány végtelen sorozatot eredményezhet, ha nem bánsz vele óvatosan.
A karakterláncok is használhatók tartományokban, és lehetővé teszik, hogy két karakterlánc közötti intervallumot kapj. Bizonyos karakterláncok esetében a viselkedése kissé váratlan lehet, ezért óvatosan használd.
"aa".."az".to_a # => ["aa", "ab", "ac", ..., "az"]
A Ruby lehetővé teszi, hogy egyedi objektumokat használj tartományokban. Ehhez az objektumnak a következőket kell megvalósítania:
Comparable modultsucc metódus<=> metódusEzek a metódusok teszik lehetővé, hogy a tartomány végig tudjon iterálni az objektumon, és össze tudja hasonlítani a tartományban lévő objektumokat.
class Foo
include Comparable
attr_reader :value
def initialize(value)
@value = value
end
def succ
Foo.new(value + 1)
end
def <=>(other)
value <=> other.value
end
end
(Foo.new(1)..Foo.new(5))
# => #<Foo:0x7f3552bebe70 @value=1>, #<Foo:0x7f3552bebe50 @value=2>, #<Foo:0x7f3552bebe40 @value=3>, #<Foo:0x7f3552bebe30 @value=4>, #<Foo:0x7f3552bebe20 @value=5>