블록스 콘 루비
기본적인
Communmente utilizamos bloques para iterar, generalmente sobre las vistas con objetos en Rails, por ejemplo:
<%= @elements.each do |e|%>
<% e.inspect %>
<% end %>
Como podemos ver este es un bloque ejecutado desde una vista de Rails. Sin embargo transportando esto a un código sin frameworks, contamos con dos versiones para poder generar bloques los cuales son los siguientes:
* La versión larga
# Esta versión generalmente la uso cuando se que voy a realizar alguna operación dentro del bloque y se que voy a ocupar mas de una linea.
elements.each do |e|
# operacion 1
# operation 2
# ........
end
* La versión corta
# Esta la utilizo cuando solo necesito una linea de retorno y la operacion no es muy compleja.
elements.each{|e| puts e}
Profundizando un poco mas en bloques.
Sin embargo que pasa cuando deseo llamar a un método y ademas requiero pasar una serie de instrucciones extra durante su invocación, como es que puedo realizar esto?
Agradezcamos a yield que viene a ayudarnos a realizar este tipo de acciones.
Supongamos que contamos con una tarea de convertir una cadena de asteriscos en una mitad de pirámide de caracteres, es decir:
half_pyramid_converter(*********)
# Output deseado
*
**
***
****
.........n
Para poder hacer esto crearemos un algoritmo que realice el trabajo y posteriormente refactorizaremos
# Version larga
def half_pyramid_converter(characters)
index = 0
piramid = ""
while(index < characters.length)
yield(piramid << characters[index]) if block_given?
index+=1
end
end
# Version refactorizada
def half_pyramid_converter_refactor(characters)
piramid = ""
characters.each_char {|char| yield( piramid << char) if block_given?}
end
# Llamadas
half_pyramid_converter("*******"){|c| puts "#{c}"}
half_pyramid_converter_refactor("**********"){|c| puts "#{c}"}
Como podemos ver en la primer version lo que hacemos es comparar la variable index contra el tamaño de la cadena si es menor agregamos el carácter a la variable piramid y gracias a yield nuevamente estaremos ejecutando lo que se encuentra dentro de los bloques.
En la segunda versión refactorizada hacemos uso del método each_char que nos brinda la clase String de Ruby, por lo tanto como dice el dicho un poco modificado "you can have your cake and eat it too", es decir si ya esta ahí pues
hagamos uso de este.
추천
Reference
이 문제에 관하여(블록스 콘 루비), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/danielpenaloza/bloques-con-ruby-1ai0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)