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]