2012-05-25 32 views
8

Tôi đang gọi phương thức RestClient::Resource#get(additional_headers = {}, &block) nhiều lần với cùng một khối nhưng trên các Tài nguyên khác nhau, tôi đã tự hỏi liệu có cách nào để lưu khối vào biến hay lưu vào một Proc chuyển đổi nó thành một khối mỗi lần.Lưu và tái sử dụng khối cho các cuộc gọi phương thức

Edit:

tôi đã làm như sau:

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) 

tôi nhận được: Syntax error, unexpected tAMPER

+0

vâng tôi làm, nó chỉ là một lỗi đánh máy khi tôi thay đổi nội dung url gốc – Mouhyi

+0

tôi đang cố gắng để quyết định nếu bạn thực sự muốn điều đó & chặn hay không. Vui lòng chỉnh sửa câu hỏi của bạn để hiển thị mã hoạt động (nếu tiết) giống như bạn đang sử dụng. – Phrogz

+0

Đó là ruby ​​1.9.3p125 – Mouhyi

Trả lời

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

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

Đặt một dấu trước một mục trong một lời gọi phương thức, ví dụ a.map!(&:to_i) gọi phương thức to_proc trên đối tượng đó và chuyển proc kết quả dưới dạng khối. Một số hình thức khác để xác định tái sử dụng khối của bạn:

foo = Proc.new{ |a,b,c| ... } 
foo = proc{ |a,b,c| ... } 
foo = ->(a,b,c){ ... } 

Nếu bạn đang gọi một phương thức với một khối và bạn muốn lưu rằng khối tái sử dụng sau này, bạn có thể làm như vậy bằng cách sử dụng một dấu trong định nghĩa phương pháp để nắm bắt các khối như một tham số proc:

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

Tôi đã cân nhắc xem có nên thảo luận điều đó hay không hành vi của 'return' bên trong cả hai) nhưng quyết định giữ nó đơn giản. Tuy nhiên, tôi sẽ không nói rằng chỉ có một hoặc khác là "chính xác", nhưng thay vì họ có hành vi khác nhau mà bạn có thể hoặc có thể không muốn. – Phrogz

Các vấn đề liên quan