ich mich verärgert mit der folgenden ausführlichen Schreiben in Ruby:Gibt es eine Abkürzung für Ruby Blocks?
polys.each { |poly| poly.edges.each {|edge| draw edge.start, edge.end } }
(polys
ein Array von Polygonen ist, Kanten ist ein Verfahren zum Polygon ein Array von Kanten Rückkehr)
Im Idealfall würde Ich mag an verkürzen, dies zu so etwas wie diese:
polys.each.edges.each { draw _.start, _.end }
Genauer gesagt würde ich gerne wissen:
- Wie könnten wir einen method_missing hack schreiben wie bei den ersten? (Beim Aufrufen mit einer fehlenden Methode könnte der Enumerator diese Methode für jedes von der Enumeration zurückgegebene Element aufrufen.)
- Gibt es eine Möglichkeit, die
|x|
mit einem beliebigen Symbol oder Standardnamen loszuwerden?
Ist es wirklich 'draw edge.start edge.end'? Nicht 'draw edge.start, edge.end'? –
Was Sie tun möchten, ist in Ruby (oder einer anderen Skriptsprache) problematisch, da Ruby bis zur Laufzeit nichts über den Empfänger weiß. Vergleichen Sie [[1,2], [3,4]]. Je {| e | setzt e} 'mit' [[1,2], [3,4]]. je {| _, e | puts e} 'Wie könnte hier ein Standardwert für die Blockvariable (n) verwendet werden? –
Als C-Coder vor vielen Monden bringt "wortreiches Schreiben" ein Lächeln auf mein Gesicht. Obwohl es nicht kürzer ist, könnten Sie es klarer finden, das, was Sie haben, in der offensichtlichen Weise in Methoden zu trennen: 'def draw_edge (edge); Zeichnen Sie edge.start, edge.end; Ende; def draw_poly (Poly); poly.each {| Kante | draw_edge (Kante)}; Ende; def draw_polys (polys) {| poly | draw_poly (Poly)} '. –