2016-08-08 4 views
0

나는 루비에 다음과 같은 자세한 기록과 함께 자신이 짜증 찾기 이런 일이 단축 :Ruby Blocks의 약자가 있습니까?</p> <p>가 이상적으로 내가 좋아하는 것까지 (가장자리의 배열을 반환 다각형의 방법이며, 가장자리 <code>polys</code> 다각형의 배열입니다)</p> <pre><code>polys.each { |poly| poly.edges.each {|edge| draw edge.start, edge.end } } </code></pre> <p>가 :

polys.each.edges.each { draw _.start, _.end } 

은 더 구체적으로 내가 알고 싶습니다 :

  • 어떻게 우리는 첫 번째와 같이 method_missing 해킹을 작성할 수 있습니까? (누락 된 메서드를 호출 할 때 열거자는 열거 형에서 반환 된 각 항목에 대해이 메서드를 호출 할 수 있습니다.
  • 기호 또는 기본 이름을 사용하여 |x|을 제거 할 수있는 방법이 있습니까? 당신이 할 수있는
+2

정말 '드로우 에지인가, 시작 에지인가'입니까? 'draw edge.start, edge.end' 아닌가요? –

+0

Ruby는 런타임까지 수신기에 대해 아무것도 모르기 때문에 Ruby (또는 스크립팅 언어)에서 문제가된다. '[[1,2], [3,4]].를 각각 비교하라. each {| e | {[1,2], [3,4]]와 함께 e {'를 넣는다.} each {| _, e | puts e}'블록 변수의 기본값을 어떻게 사용할 수 있습니까? –

+1

C 코더가 많은 달 전에 "장황한 글쓰기"는 내 얼굴에 미소를 가져다줍니다. 더 짧지는 않지만, 여러분이 가지고있는 것을 분명한 방법으로 분리하는 것이 더 명확 할 것입니다 : def def_edge (edge); draw edge.start, edge.end; 종료; def draw_poly (poly); poly.each {| 가장자리 | draw_edge (edge)}; 종료; def draw_polys (polys) {| poly | draw_poly (폴리)}'. –

답변

4

번호 가장 가까운는 다음과 같습니다

polys.flat_map(&:edges).each { |_| draw _.start, _.end } 

flat_map 다른 배열의 배열을 변환하고 단일 차원 배열로 평평하게됩니다. 블록 내부에서 매개 변수없이 단일 메서드를 호출하는 경우 &:edges 바로 가기를 사용할 수 있습니다.

이 말했다되고, 더 읽기의 나는 아마 초기 제안에 가까이 보관 것입니다 : 당신이 코드를 한 번 쓰기,

polys.each do |poly| 
    poly.edges.each {|edge| draw edge.start, edge.end } 
end 

은 기억하지만, 많이 읽고, 그래서 가독성은 간결성을 압도.

+7

'polys.flat_map (& : 가장자리) .each {| 가장자리 | draw (edge.start, edge.end)}'는 더 좋으며 별도의 메소드로 map과 flatten을 둘 다 필요가 없습니다. – philomory

+4

또한'draw_edge' 메서드를 정의하면'polys.flat_map (& : edges) .each (& method (: draw_edge))' – philomory

+0

을 적절하게 업데이트 할 수 있습니다. – Martin