2017-10-09 11 views
1
a = (1..5).select(&:even?).map do |s| 
    s * 2 
end 
a #=> [4, 8] 

로 블록을 취하는 식 리팩토링 I는 방법 및 그 블록 인수로 a의 우측 표현 리팩토링 싶다. refactor 또는 refactor2를 사용는 방법 및 그 블록 인수 루비

def refactor 
    (1..5).select(&:even?).map { |e| yield e } 
end 

def refactor2(&block) 
    (1..5).select(&:even?).map(&block) 
end 

b = refactor do |s| 
    s * 2 
end 
b #=> [4, 8] 

, 내가 원하는 것을 얻을 수 있습니다.

그러나 블록 을 사용하여 yield을 감싸거나 블록과 proc 사이를 오가며 나에게 맞는 느낌이 들지 않습니다.

더 간결한 방법이 있습니까?

+0

사용 사례에 전적으로 달려 있습니다. 내 직감은 메서드가 열거자를 반환해야한다고 말합니다. (매핑하는 것 이외의 다른 것을 원한다면 어떻게 될까요?)하지만 그 목적이 혼자서하는 질문의 목적이 무엇인지 이해하지 못합니다. – Max

답변

1

블록을 메서드에 전달해야하는 경우 두 번째 옵션을 사용합니다. 적어도이 매개 변수는 메서드 시그니처에 있으며 필요한 경우보다 명확하게 나타납니다. 더 블록이 제공되지 않은 경우

또한 나는 ArgumentError을 올릴 것 :

def refactor(&block) 
    raise ArgumentError.new("Block required") unless block 

    (1..5).select(&:even?).map(&block) 
end 
+0

블록이 제공되지 않으면 이것이 ArgumentError를 발생시키지 않을 것이라고 생각합니다 ... def foo (&blk); [1] .map (&blk); end; foo.to_a == [1]' –

+0

) 내 대답을 업데이트 할 것입니다. – csexton

0

나는 발견 Rails issue #30973Ruby issue #14045 내 질문에 대한 대답 것이다. Ruby issue 따르면

,

블록 파라미터를 이용하지 않고 다른 방법으로 특정 블록을 통과 할 수있는 방법이 없다.

그래서이 내 관심사는 성능에 대한 진짜라고 refactor 또는 refactor2

back and forth between block and proc does not feel right to me. 

이외의 다른 방법이 없습니다.

Railsrefactor 접근 방식을 사용하여이 성능 문제를 처리합니다.