2013-11-04 3 views
3

저는 술어 인 Proc를 가지고 있습니다.루비에서 술어를 부정 처리합니다.

Proc.new { |number| number.even? } 

어떻게 든 반대의 의미를 갖는 다른 Proc를 만드는 방법이 있습니까? 나는 Proc가 함수 매개 변수로 올 것이기 때문에 Proc의 "본문"을 변경할 수 없습니다.

def negate(proc) 
    negated proc with meaning opposite of this of proc 
end 

감사 :이 유사한 기능을한다고한다

not(Proc.new { |number| number.even? } 
# which of course doesn't work :(

와 나는

Proc.new { |number| number.odd? } 

아이디어로 동일한 작업을 수행 할 : 그래서 이런 걸 원하는 너는 대단히 사전에!

+0

나에게 명확하지 않습니다. 아마 당신은 proc의 결과를 부정하려고합니다. 맞나요? –

+0

네, 그 일을 할 것이라고 생각합니다. – Faery

+0

실례 (22 번째 줄)는 http://rosettacode.org/wiki/Dinesman%27s_multiple-dwelling_problem#By_parsing_the_problem을 참조하십시오. – steenslag

답변

5

다음 방법은 제공된 것과 반대의 절차를 반환합니다. 짧은 표기법을 사용하여

def negate(procedure) 
    Proc.new { |*args| !procedure.call(*args) } 
end 

또는 :

def negate(procedure) 
    proc { |*args| !procedure.call(*args) } 
end 
+2

@ArupRakshit 여기 제공된 절차의 "본문"을 변경하지 않습니다. 나는 그것을 논증으로 받아 들여 "반대"방식으로 행동하는 또 다른 절차를 되 돌린다. –

+0

대단히 감사합니다! :) – Faery

1

전혀이 도움이됩니까?

p = Proc.new { |number| number.even? } 
p.call(1) #=> false 
!p.call(1) #=> true 
+0

예, 도움이됩니다. :) 고맙습니다. – Faery