2012-05-25 27 views
8

Ben aynı blok ile RestClient::Resource#get(additional_headers = {}, &block) yöntem birden çok kez arıyorum ama bir değişken haline bloğu kurtarmak için, ya içine kaydetmek için bir yol olup olmadığını farklı Kaynakları, acaba aramalar Proc her seferinde bir bloğa dönüştürür.Kaydet ve yeniden kullanım blok

Düzenleme:

yaptım şu:

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) 

alıyorum: Syntax error, unexpected tAMPER

+0

evet biliyorum, bu sadece bir yazım hatası var ben gerçekten bu bloğu & ya da isterseniz karar vermeye çalışıyorum orijinal url – Mouhyi

+0

düzenlenebilir zaman. Lütfen, çalışmakta olduğunuz (eğer ayrıntılı) kodun neyi kullandığınıza benzediğini göstermek için lütfen sorunuzu düzenleyin. – Phrogz

+0

Bu ruby ​​1.9.3p125 – Mouhyi

cevap

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

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

bir yöntem çağrısı bir öğenin önünde bir işareti yerleştirilmesi, mesela a.map!(&:to_i), bu nesnede to_proc yöntemini çağırır ve sonuçta elde edilen sonucu bir blok olarak geçirir. senin yeniden kullanılabilir bloğu tanımlayan bazıları alternatif formlar:

Bir bloğu ile bir yöntemi aradığınız ve bir işareti kullanarak daha sonra yeniden kullanılmak üzere blok, bunu yapabileceği kaydetmek istiyorsanız
foo = Proc.new{ |a,b,c| ... } 
foo = proc{ |a,b,c| ... } 
foo = ->(a,b,c){ ... } 

yöntem tanımında bir proc parametre olarak blok yakalamak için:

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

Bunu tartışmak ister kabul (ve farklı 'return' in davranışları her ikisinin de içinde kalıyordu, ancak bunu basit tutmaya karar verdiler. Bununla birlikte, sadece bir tanesinin ya da diğerinin “doğru” olduğunu söylemem, ama isteyebileceğin ya da istemeyebileceğin farklı davranışları var. – Phrogz