2012-05-25 15 views
8

Sto chiamando il metodo RestClient::Resource#get(additional_headers = {}, &block) più volte con lo stesso blocco ma su risorse diverse, mi chiedevo se c'è un modo per salvare il blocco in una variabile, o per salvarlo in un Proc lo converte in un blocco ogni volta.Salvare e riutilizzare il blocco per le chiamate di metodo

Edit:

ho fatto la seguente:

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) 

ottengo: Syntax error, unexpected tAMPER

+0

si lo faccio, è solo un errore di battitura quando ho modificato l'URL originale – Mouhyi

+0

sto cercando di decidere se si vuole veramente che & blocco oppure no. Modifica la tua domanda per mostrare che aspetto ha il codice funzionante (se verboso) che stai già utilizzando. – Phrogz

+0

È rubino 1.9.3p125 – Mouhyi

risposta

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

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

un'inserzione commerciale di fronte ad un elemento in una chiamata di metodo, per esempio a.map!(&:to_i) chiama il metodo to_proc su quell'oggetto e passa il proc risultante come blocco. Alcune forme alternative di definizione del vostro riutilizzabile blocco:

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

Se si chiama un metodo con un blocco e si desidera salvare che blocco per il riutilizzo in seguito, è possibile farlo utilizzando una e commerciale nella definizione del metodo per catturare il blocco come parametro 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

Ho considerato se discuterne (e le diverse comportamento di 'return' dentro entrambi) ma ha deciso di mantenerlo semplice. Tuttavia, non direi che solo uno o l'altro è "corretto", ma piuttosto che hanno un comportamento diverso che potresti o non vorresti. – Phrogz

Problemi correlati