2012-10-08 7 views
0

의 난 (도우미가 실제로하는) 방법이 있다고 가정 해 봅시다 작업 올리기 ArgumentError: wrong number of arguments (0 for 1) 오류. 이 방법을 다음과 같이 블록으로 호출 할 수 있다는 것을 알고 있습니다.배열에 메서드를 매핑하는 방법은 무엇입니까?</p> <pre><code>(1..10).map &f </code></pre> <p>그것은 분명하지 않습니다이다 :</p> <pre><code>def f(x) x + 1 end </code></pre> <p>내가하고 싶은 것은과 같이 열거 가능한을 통해 매핑하는 것입니다

(1..10).map {|x| f x } 

그러나 나에게 우아한 해결책은 아닙니다. 그것에 대해 무엇을 할 수 있습니까?

+1

'(1..10) .map (& : f)'을 사용하면 실제로'1.f','2.f' 등이 호출된다는 것을 명심하십시오. 그래서,'f'가'Fixnum'을위한 메소드가 아니라면, 아무 것도 시도하지 않을 것입니다. –

+0

@CharlesCaldwell 이것이': "을 예제에 추가하지 않은 이유입니다.'f'가 밖에 정의 된 메소드임을 보여줍니다. 'Fixnum' 클래스의. – Andrew

답변

4

당신은 사용할 수 있습니다 : 모든

(1..10).map(&method(:f)) 
+0

굉장해! 전혀 몰랐다. 설명해 주시겠습니까? –

+0

좋은 하나! 잘 했어. –

+2

설명? 'Object # method'는'Proc'처럼 호출 될 수있는'Method' 객체를 리턴합니다. 'Method # call'에 전달한 모든 것은 메소드 호출을위한 인자로 사용됩니다. –

2

첫째, 나는이

(1..10).map {|x| f x } 

일반적으로 어떤 우미하지 않음을 볼 수 없습니다, 당신은 그것을 사용해야합니다. 그러나 특수한 상황에서는 특수 형식을 사용할 수 있습니다 (객체에 대한 메소드를 호출해야하며 해당 메소드는 인수를 허용하지 않습니다).

class Fixnum 
    def f 
    self + 1 
    end 
end 

(1..10).map(&:f) 

이 두 가지 방법 중 어느 것이 든 나는 첫 번째 것을 택할 것입니다.

+0

고마워, 클래스 메서드를 추가하는 방법에 대해 생각했지만, 헬퍼 메서드 중 하나이기 때문에 다른 클래스를 손상시키지 않고 자체 모듈 아래에 유지하는 것이 더 좋습니다. – Andrew