K{}DAMAN

Etiketler


Son Yazılar


Veri yapısı üzerine yineleyici yazmak

Melih KocatürkMelih Kocatürk

Problem: Özel bir veri yapısı oluşturdunuz ve bunun için each metodunu uygulamak istiyorsunuz veya mevcut bir veri yapısı üzerinde sıradışı bir yineleme metodu uygulamak istiyorsunuz.

Çözüm: Karmaşık veri yapıları genellikle temel veri yapılarından oluşur: çırpı, diziler vb. Temel veri yapılarının tümü each metodunu tanımlamıştır. Veri yapınız tamamen skaler değerlerden ve bu basit veri yapılarından oluşuyorsa, her bileşen için yeni bir each metodu yazabilirsiniz.

İşte basit bir ağaç veri yapısı. Bir ağaç tek bir değer ve bir çocuk listesi (her biri daha küçük bir ağaç) içerir:

class Tree
	attr_reader :value
	
	def initialize(value)
		@value = value
		@children = []
	end

	def <<(value)
		subtree = Tree.new(value)
		@children << subtree
		return subtree
	end
end

Spesifik bir ağaç oluşturma kodu:

t = Tree.new("Parent")
child1 = t << "Child 1"
child1 << "Grandchild 1.1"
child1 << "Grandchild 1.2"
child2 = t << "Child 2"
child2 << "Grandchild 2.1"

Bu veri yapısını nasıl yineleyebiliriz? Ağaç özyinelemeli olarak tanımlandığından, özyinelemeli olarak yinelemek anlamlıdır. Tree#each'ın bu uygulaması ağaçta depolanan değeri verir, sonra çocukları üzerinde yinelenir (çocuklar zaten each destekleyen bir dizide depolanır) ve her alt ağaçta tekrar tekrar Tree#each çağırır:

class Tree
	def each
		yield value

		@children.each do |child_node|
			child_node.each { |e| yield e }
		end
	end
end

each metodu, ağacı aşağıdaki gibi ekrana basar:

t.each { |x| puts x }
# Parent
# Child 1
# Grandchild 1.1
# Grandchild 1.2
# Child 2
# Grandchild 2.1

İşini seven bir yazılımcı ve bilişim okur-yazarı olarak, kendimi nasıl geliştirebilirim sorusuna cevap arıyor...

Comments 0
There are currently no comments.