Ich brauchte eine Funktion, die Array#select
ähnlich ist, aber übergibt nicht nur das Datenelement, sondern auch den Index des Elements (ähnlich Enumerable#each_with_index
). Ich versuchte dies:Ruby: Kombinieren von Enumeratoren, Erstellen eines neuen Enumerators
['a','b','a','a','c'].select_with_index {|letter,index| letter == 'a' && index > 1 }
Ergebnisse in
["a", "a"]
wie erwartet:
class Array
def select_with_index
self.each_with_index.select {|*args| yield(*args)}.map(&:first)
end
end
Diese in der Tat scheint zu funktionieren. Was mir aber mit meiner Lösung nicht gefällt ist, dass man einen Block liefern lässt. Ähnliche Methoden im Ruby-Core können ohne Block aufgerufen werden und ergeben eine Enumerator
. Wie kann ich das machen? Ich weiß, dass ich block_given?
verwenden kann, um auf das Vorhandensein des Blocks zu testen, aber wie mache ich dann weiter? Brauche ich eine Fiber
?
BTW, sollte der Code mit beiden Ruby 1.9.3 arbeiten. und 2.x.
Es ist schwer zu verwenden in Metaprogrammierung, e. G. in irgendwie 'public_send selector_name, & λ'. – mudasobwa
Nun, gib diesem Namen dann einen Namen: http://pastie.org/10786273 –