2017-08-08 3 views
1

Je voudrais créer un itérateur que je peux passer à une méthode pour la méthode à appeler.Dans Ruby, pouvez-vous utiliser la méthode d'appel lambda ou ou Proc pour appeler un itérateur?

#!/usr/bin/env ruby 

puts "------------------------------------" 
puts "1 This works." 
puts "------------------------------------"  
1.times {|who| puts "Position #{who} works!"} 

puts "------------------------------------" 
puts "2 This works." 
puts "------------------------------------"  
aBlock = Proc.new { |who| puts "Position #{who} also works!" }  
2.times &aBlock 

puts "------------------------------------" 
puts "3 This works." 
puts "------------------------------------"  
def eachIndex 
    3.times { |i| yield i } 
end 

eachIndex &aBlock 

puts "------------------------------------" 
puts "4 This does not work." 
puts "------------------------------------"  
iterator = lambda { |name| yield name }  
iterator.call(4) {|who| puts "Does not work #{who}:-("} 

puts "------------------------------------" 
puts "5 This does not work." 
puts "------------------------------------"  
iterator = lambda { |name,&block| yield name }  
iterator.call(5) {|who| puts "Does not work #{who}:-("} 

puts "------------------------------------" 
puts "6 This does not work." 
puts "------------------------------------"  
iterator = Proc.new { |name,&block| yield name }  
iterator.call(6) {|who| puts "Does not work #{who}:-(" } 

Est-ce que lambda ou proc peuvent être des itérateurs dans Ruby? Je voudrais les passer à une classe en tant que paramètre.

+0

'add_one = -> (num) {num + 1}; [10, 20, 30, 100] .map (& add_one) # => [11, 21, 31, 101] ' – Kris

+0

Je cherchais l'itérateur pour donner comme les itérateurs devraient. –

Répondre

1

Voici la façon de le faire

iterator = -> (name, &block) { block.call name } 
iterator.call(4) { |who| puts "It works now #{who} :)" } 

post-scriptum Notez que j'utilise un raccourci ici pour un lambda, -> appelé stabby lambda

+0

Génial! Merci, c'est exactement ce que je cherchais. –

+0

Peut-être pas si vite. La fonction lambda appelle le bloc, ce qui est un pas dans la bonne direction, mais il devrait produire plusieurs fois comme un itérateur. –

+0

Mais peut-être que cela finit par être un type différent d'itérateur qui appelle le bloc à plusieurs reprises plutôt que de céder à plusieurs reprises au bloc. –