ruby - puede - Cuando usar bloques
pokemon rubi omega peso (3)
Esto es lo que la gente de programación funcional llama "estilo de paso de continuación" . Es una técnica válida, aunque hay casos en los que tenderá a complicar las cosas más de lo que vale. Podría valer la pena volver a ver algunos de los lugares donde lo estás usando y ver si ese es el caso en tu código. Pero no hay nada inherentemente malo en ello.
¡Me encantan los bloques de rubí! La idea detrás de ellos es simplemente muy muy ordenada y conveniente.
Acabo de revisar mi código de la última semana, que es básicamente cada función de Ruby que he escrito , y he notado que ninguna de ellas devuelve un valor. ¡En lugar de devolver valores, siempre uso un bloque para devolver los datos!
Incluso me he sorprendido pensando en escribir una pequeña clase de estado que me permitiría escribir código como:
something.do_stuff do |status|
status.success do
# successful code
end
status.fail do
# fail code
puts status.error_message
end
end
¿Estoy usando bloques demasiado? ¿Hay un momento para usar bloques y un tiempo para usar valores de retorno?
¿Hay alguna trampa a tener en cuenta? ¿Mi gran uso de bloques vendrá y me morderá alguna vez?
Me gusta este estilo. En realidad es muy similar a Ruby, y a menudo verás proyectos reestructurando su código para usar este formato en lugar de algo menos legible.
Los valores de retorno tienen sentido donde los valores de retorno tienen sentido. Si tiene un objeto Article
, desea que article.title
devuelva el título. Pero para este ejemplo particular de devoluciones de llamada, es un estilo estelar, y es bueno que sepa cómo usarlos. Sospecho que muchos nuevos en Ruby nunca descubrirán cómo hacerlo bien.
Todo sería más legible como:
if something.do_stuff
#successful code
else
#unsuccessful code
end
o para usar un idioma común de los carriles:
if @user.save
render :action=>:show
else
@user.errors.each{|attr,msg| logger.info "#{attr} - #{msg}" }
render :action=>:edit
end
En mi humilde opinión, evitar el retorno de un valor booleano es el uso excesivo de bloques de código.
Un bloque tiene sentido si. . .
Permite que el código use un recurso sin tener que cerrar ese recurso
open("fname") do |f|
# do stuff with the file
end #don''t have to worry about closing the file
El código de llamada tendría que hacer un cálculo no trivial con el resultado.
En este caso, evita agregar el valor de retorno al ámbito de llamada. Esto también a menudo tiene sentido con múltiples valores de retorno.
something.do_stuff do |res1, res2|
if res1.foo? and res2.bar?
foo(res1)
elsif res2.bar?
bar(res2)
end
end #didn''t add res1/res2 to the calling scope
El código debe ser llamado tanto antes como después del rendimiento.
Usted ve esto en algunos de los ayudantes de rieles:
<% content_tag :div do %>
<%= content_tag :span "span content" %>
<% end -%>
Y, por supuesto, los iteradores son un gran caso de uso, ya que son considerados por los rubíes más bonitos que los bucles o las listas de comprensión .
Ciertamente no es una lista exhaustiva, pero le recomiendo que no solo use bloques porque puede.