2014-04-14 1 views
3

Ruby에서 메서드가 &block을 사용하도록 지정하는 것이 더 좋습니다 (스타일?)?def에 인수를 지정하고 차단해야합니까?

메서드 본문에 yield이 포함되어있는 한 선택할 수있는 스타일이 문제인 것 같습니다.

def abc1(a, c) 
    puts a 
    yield 
    puts c 
end 

def abc2(a, c, &block) 
    puts a 
    yield 
    puts c 
end 

다음과 같은 두 가지 전화 :

abc1('a', 'c') { puts 'b' } 
abc2('a', 'c') { puts 'b' } 

각 인쇄 및 반환 같은 일 :

a 
b 
c 
=> nil 

그래서, 정말 단지를 만약 주어진 예를 들어

, 스타일의 문제, 컨벤션 (또는 더 나은 스타일)이란 무엇입니까?

답변

5

현재 코드를 먼저 사용하는 것이 좋습니다. yield을 사용하는 동안 &block을 사용하지 않아도됩니다. 은 암시 적으로입니다. 하지만 그렇습니다, 한가지 상기 시키려면, yield을 사용하는 동안 블록을 통과해야합니다. 그렇지 않으면 오류가 발생합니다. 이 오류는 block_given?을 사용하여 처리 할 수 ​​있지만

루비의 yield 문은 메소드의 본문에서 사용자가 지정한 블록을 제어합니다. 따라서 다시 사용하는 경우 &block은 중복되므로 사용하지 않아도됩니다.

2

개인 취향의 문제입니다. 블록이이 예에서와 같이, 내재적으로 전달 될 때

def abc1(a, c) 
    puts a 
    yield 
    puts c 
end 

yield 종종 사용되어 다음과 같이 두 가지 일반적인 예이다. 당신은 일반적으로 볼 수있는 다른이에

def abc2(a, c, &block) 
    puts a 
    block.call(args) 
    puts c 
end 

장점은 코드를 읽는 사람이 쉽게 블록이 전달 될 필요가 있음을 볼 수입니다.

3

이 주된 이유는 매개 변수가 물체 (클래스 Proc의 경우)로 전환되는 것을 그대로 블록을 통과하므로이 전달 될 수 있다는 것을 기억해야한다 :

def ab(&block) 
    yield "ab" 
    cd(&block) 
end 

def cd(&block) 
    yield "cd" 
    block.call("cd") 
end 

ab { |str| puts "In #{str}. Please pass the salt, the pepper and the proc." } 
In ab. Please pass the salt, the pepper and the proc. 
In cd. Please pass the salt, the pepper and the proc. 
In cd. Please pass the salt, the pepper and the proc. 
관련 문제