2013-10-15 13 views
11

Ho appena letto il seguente codice:Cos'è questa sintassi Ruby?

class Dir 
    def self.create_uniq &b ### Here, & should mean b is a block 
     u = 0 
     loop do 
     begin 
     fn = b[u] ### But, what does b[u] mean? And b is not called. 
     FileUtils.mkdir fn 
     return fn 
     rescue Errno::EEXIST 
     u += 1 
     end 
    end 
    io 
    end 
end 

ho messo la mia confusione come commento nel codice.

risposta

12

La definizione del metodo con &b alla fine consente di utilizzare il blocco passato al metodo come oggetto Proc.

Ora, se avete Proc esempio, [] sintassi è una scorciatoia per call:

p = Proc.new { |u| puts u } 
p['some string'] 
# some string 
# => nil 

Documentato qui ->Proc#[]

+3

Secondo la [Guida Rubino Stile] (https: // GitHub .com/bbatsov/ruby-style-guide) si dovrebbe * "Preferire' proc.call() 'su' proc [] 'o' proc.() 'sia per lambdas che procs." * – Stefan

+3

@Downvoter: Spiegare il tuo downvote. –

1

Il & operatore prefisso permettono un metodo per catturare un blocco passato come un nome parametro. ad esempio:

def wrap &b 
    3.times(&b) 
    print "\n" 
end 

ora se si chiama sopra metodo come questo:

wrap { print "Hi " } 

poi uscita sarebbe:

Hi Hi Hi 
Problemi correlati