28 Oct 2015

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"}>

Kaynaklar

Aşkın Gedik
Ruby on Rails Developer

Ben Aşkın, Protel Teknoloji Çözümlerinde yazılım geliştirme takım lideri olarak çalışıyorum.

Benimle ilgili daha fazla bilgiyi hakkımda sayfasına göz atarak veya Twitter, Facebook, Github ve Gplus üzerinden takip ederek öğrenebilirsiniz.