Bugün sizlere ilk kez discourse kodlarına bakarken gördüğüm bir olayı anlatacağım. Çekirdeğinizi, kolanızı aldıysanız başlıyorum, toplanın.
Set için yinelenen elemanlara izin vermeyen ve elemanların sırasız olarak toplandığı veri tipi diyebiliriz. Elemanlar array’de olduğu gibi index bazlı değil. Yani bu ne demek, ben 3. elemanı getir diyemem veya belli bir kurala göre sıralayamam.
Set, ruby core içinde yer almıyor, standart kütüphane içinde yer alıyor. Bu yüzden require etmemiz gerekiyor.
require 'set'
Birkaç örnek
> s = Set.new([1,2,3])
> s << 1
> s.add 2
> s.delete(1)
> s.include? 1
> s.merge([2, 6])
Bir array objesini set objesine çevirmek için to_set methodu yeterli.
> a = [2, 1, 5, 6, 4, 5, 3, 3, 3]
> b = a.to_set
#<Set: {2, 1, 5, 6, 4, 3}>
> b.class
Set < Object
> a.class
Array < Object
> s1 = [1,2,3].to_set
> s2 = [2,3,4].to_set
> s1 & s2 # <Set: {2, 3}>
> s1 | s2 # <Set: {1, 2, 3, 4}>
> [1,2,3] ^ [2,3,4]
# NoMethodError: undefined method `^' for [1, 2, 3]:Array
> s1 ^ s2 # <Set: {4, 1}>
Biri set, diğeri array olursa olmuyormuş.
> a | b
TypeError: no implicit conversion of Set into Array
> Set[1,2,3] == Set[3,1,2] #true
> [1,2,3] == [3,1,2] # false
> Set[3,2,5,1].sort.class # Array < Object
SortedSet
Bir de Set‘ten implement edilmiş bir veri türü olan SortedSet var. <=> methodu ile sıralama yapıyor.
> set = SortedSet.new([2, 1, 5, 6, 4, 5, 3, 3, 3])
# <SortedSet: {1, 2, 3, 4, 5, 6}>
Karşılaştırılabilir bir eleman eklenmediği zaman patlıyor. Sıralama işlemi yapamıyor ama Set veri tipi özelliklerini(uniq olma gibi) koruyor.
> set = SortedSet.new([12, 3, -3, "-13", nil, "b", "ab", "aab", 3, 3])
# ArgumentError: comparison of Fixnum with nil failed
> set
# <SortedSet: {12, 3, -3, "-13", nil, "b", "ab", "aab"}>