K{}DAMAN

Etiketler


Son Yazılar


Kod bloğunda dış değişkenleri kullanmak

Melih KocatürkMelih Kocatürk

Problem: Değişkenleri bir metod ve içinde tanımlanmış bir kod bloğu arasında paylaşmak istiyorsunuz.

Çözüm: Sadece değişkenlere referans verin, Ruby doğru olanı yapacaktır. İşte dizinin her elemanına belirli bir sayı ekleyen bir metod:

def add_to_all(array, number)
	array.collect { |x| x + number }
end

add_to_all([1, 2, 3], 10) # => [11, 12, 13]

Enumerable#collect doğrudan number‘a erişemez, ancak blok tanımlandığında number kapsam dahilinde olduğundan değişkene erişebilir.

Ruby bloğu tanımlandığı bağlamı etrafında taşır. Bu kullanışlıdır, çünkü bir bloğu normal kodunuzun parçasıymış gibi tanımlamanıza olanak tanır.

Bir Ruby bloğu, değerlerin kopyalarını değil, değişken bağlantılarına referanslar içerir. Değişken daha sonra değişirse, blok yeni değere erişebilir:

tax_percent = 6

position = lambda do
	"I have always supported a #{tax_percent}% tax on imported limes."
end

position.call
# => "I have always supported a 6% tax on imported limes."
tax_percent = 7.25

position.call
# => "I have always supported a 7.25% tax on imported limes."

Bu her iki yönde de çalışır: bir değişkeni blok içinden yeniden bağlayabilir veya değiştirebilirsiniz:

counter = 0
4.times { counter += 1; puts "Counter now #{counter}"}
# Counter now 1
# Counter now 2
# Counter now 3
# Counter now 4
counter # => 4

Bu özellikle bir yineleyici ile birlikte inject veya collect simülasyonu yapmak istediğinizde kullanışlıdır. Bloğun dışında bir depolama nesnesi oluşturabilir ve bloğun içinden bir şeyler ekleyebilirsiniz. Bu kod Enumerable#collect simülasyonu yapar, ancak bir dizinin öğelerini ters sırada toplar:

accumulator = []
[1, 2, 3].reverse_each { |x| accumulator << x + 1 }
accumulator # => [4, 3, 2]

accumulator değişkeni Array#reverse_each dizisinin kapsamında değildir, ancak blok kapsamındadır.

İş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.