2012-05-16 17 views

risposta

7

Non in generale; è totalmente al metodo stesso con quale argomento viene chiamato il blocco, e nel momento in cui è stato chiamato each (che chiama il tuo blocco), il fatto che la stringa 'some_directory' è stata passata a Dir.new è stata a lungo dimenticata, ovvero sono abbastanza cose separate

Si può fare qualcosa di simile, però:

Dir.new(my_dir = 'some_directory').each do |file| 
    puts "#{my_dir} contains #{file}" 
end 
+1

Oooo, mi piace! Non ero nemmeno consapevole che fosse legale. Sono ancora un rubino n00b. Mi spiace di non poterti votare, non ho ancora una reputazione. –

+0

ie, questo è esattamente quello che stavo cercando. Stavo solo cercando di salvarmi UNA riga di codice e questo è :) –

+0

:)! È un buon modo per rendere le cose compatte, ma come la maggior parte delle cose buone, l'uso eccessivo porterà a codice illeggibile, quindi tendo ad usarlo con parsimonia o dove abbia senso. (Penso che abbia senso qui.) – Ashe

2

Il motivo per cui non funziona è che new e each sono due metodi diversi in modo che non abbiano accesso ai rispettivi parametri. Per il codice 'sexify', si potrebbe prendere in considerazione la creazione di un nuovo metodo per contenere le due chiamate di metodo e passare il parametro ripetuto che:

def do_something(dir) 
    Dir.new(dir).each do |file| 
    # use dir in some way 
    end 
end 

Il fatto che la creazione di un nuovo metodo ha un basso overhead tale significa che è del tutto È ragionevole crearne uno per una piccola porzione di codice come questo - ed è una delle molte ragioni per cui Ruby è un piacere per una lingua con cui lavorare.

+0

fredda; Avevo paura di questo. So che posso assegnare 'some_directory' a una variabile ma stavo cercando di salvarmi un'intera riga :) Grazie! –

+0

Nessun problema! :-) – Russell

+0

Whoa, ovviamente lo so, ma quando ho risposto la prima volta mostrava solo la prima riga della tua risposta. Le persone rispondono così velocemente qui! Ringrazia tutti! –

0

Basta romperlo in una variabile. I blocchi di rubino sono chiusure quindi avranno accesso -

dir = 'some_directory' 
Dir.new(dir).each do |file| 
    # use dir here as expected. 
end 
Problemi correlati