2012-05-25 3 views
8

동일한 블록에서 다른 리소스로 여러 번 RestClient::Resource#get(additional_headers = {}, &block) 메서드를 호출하려고합니다. 블록을 변수에 저장하거나 저장하는 방법이 있는지 궁금합니다. Proc은 매번 블록으로 변환합니다.메소드 호출을위한 블록 저장 및 재사용

편집 :

나는 한 다음

resource = RestClient::Resource.new('https://foo.com') 
redirect = lambda do |response, request, result, &block| 
    if [301, 302, 307].include? response.code 
    response.follow_redirection(request, result, &block) 
    else 
     response.return!(request, result, &block) 
    end 
end 
@resp = resource.get (&redirect) 

를 내가 얻을 : Syntax error, unexpected tAMPER

+0

예 내가, 그냥 오타의 나는 당신이 정말 블록을 원하거나하지 여부를 결정하기 위해 노력하고있어 원래 URL – Mouhyi

+0

을 편집 할 때. 질문을 편집하여 이미 사용중인 코드 (작동중인 경우)가 어떻게 표시되는지 확인하십시오. – Phrogz

+0

루비 1.9.3p125 – Mouhyi

답변

16
foo = lambda do |a,b,c| 
    # your code here 
end 

bar.get(&foo) 
jim.get(&foo) 
jam.get(&foo) 

메소드 호출의 항목 앞에 앰퍼샌드 배치, 예를 들어, a.map!(&:to_i)은 해당 개체에 대해 to_proc 메서드를 호출하고 결과 proc를 블록으로 전달합니다. 재 사용 가능한 블록을 정의하는 몇 가지 다른 형태 :

당신이 블록 메서드를 호출하고 있고 앰퍼샌드를 사용하여 나중에 다시 사용할 블록이, 당신이 그렇게 할 수있는 을 저장하려면
foo = Proc.new{ |a,b,c| ... } 
foo = proc{ |a,b,c| ... } 
foo = ->(a,b,c){ ... } 

메소드 정의에 발동 매개 변수로 블록을 캡처 :

class DoMany 
    def initialize(*items,&block) 
    @a = items 
    @b = block # don't use an ampersand here 
    end 
    def do_first 
    # Invoke the saved proc directly 
    @b.call(@a.first) 
    end 
    def do_each 
    # Pass the saved proc as a block 
    @a.each(&@b) 
    end 
end 

d = DoMany.new("Bob","Doug"){ |item| puts "Hello, #{item}!" } 

d.do_first 
#=> Hello, Bob! 

d.do_each 
#=> Hello, Bob! 
#=> Hello, Doug! 
+0

나는 두 가지 모두에서'return '의 동작)하지만 단순하게 유지하기로 결정했습니다. 그러나, 나는 단지 하나 또는 다른 것이 "정확하다"라고 말하지는 않을 것입니다. 그러나 그들은 당신이 원하거나 원하지 않을 수도있는 다른 행동을 가지고 있다고 말하지 않습니다. – Phrogz

관련 문제