2011-09-20 7 views
6

Eventuali duplicati:
Ruby block and unparenthesized arguments
What is the difference or value of these block coding styles in Ruby?Perché non sono do/end e {} sempre equivalenti?

Ho sempre pensato che i seguenti sono solo due modi di dire la stessa cosa:

[1,2,3].collect{|i| i * 2} 

[1,2,3].collect do |i| 
    i * 2 
end 

Ma io sono ottenere un comportamento strano in uno dei miei modelli ERB in cui la sintassi due sembra che facciano due cose diverse. Questo codice funziona alla grande:

<%=raw @menu.collect { |m| 
    content_tag("li") { 
     link_to(m.capitalize, url_for(:controller => m)) 
    } 
} %> 

Ma quando ho ri-scrivere come:

<%=raw @menu.collect do |m| 
    content_tag("li") do 
     link_to(m.capitalize, url_for(:controller => m)) 
    end 
end %> 

... Ho appena finisce con una stringa concatenata dei miei oggetti @menu. Mi sto perdendo qualcosa? C'è qualche piccolo chicco di zucchero sintattico che sta arrivando qui?

+3

Questo è un duplicato di [Rubino blocco Errore di sintassi] (http://StackOverflow.Com/q/6854283/), [blocco di codice passato a 'each' lavora con staffe, ma non con' do'- 'end' (ruby)] (http://StackOverflow.Com/q/6718340/), [Definizione blocco - differenza tra parentesi e' do'-'end'?] (http://StackOverflow.Com/q/ 6179442 /), [Blocco multiplo di Ruby senza 'do'' fine'] (http://StackOverflow.Com/q/3680097/), [Uso di 'do' block vs parentets' {} '] (http: // StackOverflow .Com/q/2122380 /), [Qual è la differenza o il valore di questi stili di codifica dei blocchi in Ruby?] (Http://StackOverflow.Com/q/533008/) ... –

+2

... e [Blocco ruby ​​e argomenti non separati] (http://StackOverflow.Com/q/420147/). –

+0

Ack! Ora sono diviso. Per cancellare o non cancellare? Con 4 upvotes, forse la mia formulazione è utile a qualcuno? –

risposta

0

Vorrei utilizzare il primo metodo o inserire questo codice in un helper di visualizzazione. Ma se volessi usare i blocchi probabilmente farei qualcosa del genere.

<% @menu.collect do |m| %> 
    <%= content_tag("li") do %> 
     <% link_to(m.capitalize, url_for(:controller => m)) %> 
    <% end %> 
<% end %> 
Problemi correlati