Skip to content

Instantly share code, notes, and snippets.

@cptangry
Created July 30, 2017 11:07
Show Gist options
  • Save cptangry/7cac872155389e9564226d6d9452009f to your computer and use it in GitHub Desktop.
Save cptangry/7cac872155389e9564226d6d9452009f to your computer and use it in GitHub Desktop.
Ruby Enumerator & Generators
#!/usr/bin/env ruby
# -*- coding: utf-8
# İLERİ SEVİYE DERSLER 1 :: ENUMARATORLER
ucgensel_sayilar = Enumerator.new do |y|
n = 0
sayac = 1
loop do
n += sayac
sayac += 1
y.yield n
end
end
def fibonacci
Enumerator.new do |y|
a = b = 1
loop do
y.yield a
a, b = b, a + b
end
end
end
def sonsuz_secici(enum, &blok)
Enumerator.new do |y|
enum.each do |deger|
y.yield deger if blok.(deger)
end
end
end
# Elle yaratılmış bir sonsuz enumeratorden değer seçici ile değerleri toplamak
puts 'Üçgensel Sayılar İlk Tek 10:'
p sonsuz_secici(ucgensel_sayilar) {|deger| deger.odd? }.first 10
puts 'Fibonacci İlk Çift 10:'
p sonsuz_secici(fibonacci) {|deger| deger.even? }.first 10
# Diğer yol lazy ile enumeratoru aşamalandırmak
puts 'Fibonacci İlk Çift 20:'
p fibonacci.lazy.select(&:even?).first 20
puts 'Üçgensel Sayılar İlk Tek 20:'
p ucgensel_sayilar.lazy.select(&:odd?).first 20
# Fiber (python tarzı generator)
def fibernacci
Fiber.new do
a, b = 0, 1
loop do
Fiber.yield(b)
a, b = b, a + b
end
end
end
generator = fibernacci
20.times do
print "Fiberledik: ", generator.resume, "\n"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment