Skip to content

Ranges

Başı, sonu olan, tanımlanan belli bir aralıktaki değerleri gösteren nesneler Range sınıfındadır. Örneğin 0’la 5 arasındaki sayılar Range olarak ifade edilebilir;

(0..5)           # => 0..5
(0..5).class     # => Range
(0..5).to_a      # => [0, 1, 2, 3, 4, 5]
(0..5).to_a.join # => "012345"
(0..5).each      # => #<Enumerator: 0..5:each>

(0..5) ifadesinde 0 ve 5 dahil olmak üzere bir aralık tanımladık. İstediğimiz gibi işleyebiliriz.

(-10..0).to_a      # => [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0]
(0..-10).to_a      # => []
("a".."e").to_a    # => ["a", "b", "c", "d", "e"]

Eğer .. yerine ... kullanırsak, yani (0..5) dersek, 5 hariç demiş oluruz;

(0...5).to_a         # => [0, 1, 2, 3, 4]
("a"..."e").to_a     # => ["a", "b", "c", "d"]

Son değer hariç mi dahil mi anlamak için exclude_end? method’unu kullanırız;

(5..10).exclude_end?          # => false
(5...10).exclude_end?         # => true

Range aslında bir Class’dır ve her Class gibi;

r = Range.new(0,2)     # => 0..2
r.to_a                 # => [0, 1, 2]

kullanılabilir. == ya da eql? method’u ile karşılaştırılabilir;

(0..2) == (0..2)            # => true
(0..2).eql?(0..2)           # => true
(0..2) == (0...2)           # => false
(0..2) == Range.new(0,2)    # => true
(0..2).eql?(Range.new(0,2)) # => true

begin, first, cover?, include?, member?, end, last

Aralığın başlama değerini almak için begin ya da first kullanabildiğimiz gibi, first’e parametre geçerek, ilk N değeri de okuyabiliriz;

(5..10).begin               # => 5
(5..10).first               # => 5
(5..10).first(2)            # => [5, 6]  # ilk 2 değeri ver

Belirlediğimiz aralık içinde sorgu yapmak için cover? ya da include? ya da member? method’unu kullanırız. cover? kullanırken eğer verdiğimiz değer aralık içindeyse sonuç true döner;

(5..10).cover?(6)               # => true
(5..10).cover?(4)               # => false
(5..10).cover?(11)              # => false
(5..10).cover?(9)               # => true
("a".."z").cover?("b")          # => true
("a".."z").cover?("1")          # => false
("a".."z").cover?(1)            # => false
("a".."z").cover?("abc")        # => true

include? ile cover? arasındaki fark ise şudur; cover?a verilen parametredeki değer, örnekteki abc teker teker range içinde var mı? yani a var mı? b var mı? c var mı? şeklinde olurken, include? da abc var mı? şeklindedir;

("a".."z").cover?("abc")        # => true
("a".."z").include?("abc")      # => false

("a".."z").cover?("a")        # => true
("a".."z").include?("a")      # => true

Tahmin edeceğiniz gibi, end ile son değeri alırız.

(5..10).end                 # => 10
(5...10).end                # => 10

last ile de aynı first deki gibi son ya da son N değeri okuruz;

(5..10).last                  # => 10
(5..10).last(3)               # => [8, 9, 10]

min, max, size

min ve max ile tanımlı aralıktaki en büyük/küçük değeri alırız, size bize boyu verir;

(5..10).min        # => 5
(5..10).max        # => 10
(5..10).size       # => 6

step ile kaçar kaçar artacağını veririz;

r = Range.new(0, 5)
r.step(2) # => #<Enumerator: 0..5:step(2)>
r.step(2).to_a # => [0, 2, 4]