No conozco a ningún Ruby y estoy leyendo documentación sobre él ahora. Una duda que acabo de leer sobre el uso de bloques de código y la palabra clave "rendimiento" es si es posible pasar más de un bloque de código a una función, y usar ambos a voluntad desde dentro de la función llamada.¿Cómo pasar más un bloque de código a una función en Ruby?
Respuesta
Puede pasar solo un bloque a la vez, pero los bloques son en realidad instancias Proc
y puede pasar tantas instancias como desee.
def mymethod(proc1, proc2, &block)
proc1.call
yield if block_given?
proc2.call
end
mymethod(Proc.new {}, Proc.new {}) do
# ...
end
Sin embargo, rara vez tiene sentido.
Sintácticamente, el uso de la instrucción yield
solo admite un bloque de código que se transfiere a la función.
Por supuesto, puede pasarle una función a otras funciones múltiples o "objetos de bloque de código" (objetos Proc
), y usarlos, pero no simplemente usando yield
.
Puedes crear objetos Proc
y pasar tantos como quieras.
Recomiendo leer this page para comprender las sutilezas de todas las construcciones diferentes de bloque y cierre Ruby has.
Usted puede utilizar el método call
en lugar de rendimiento para manejar dos bloques separados aprobadas en
Así es como:.
def mood(state, happy, sad)
if (state== :happy)
happy.call
else
sad.call
end
end
mood(:happy, Proc.new {puts 'yay!'} , Proc.new {puts 'boo!'})
mood(:sad, Proc.new {puts 'yay!'} , Proc.new {puts 'boo!'})
Puede pasar argumentos por ejemplo:
happy.call('very much')
los argumentos funcionan tal como se esperaría en los bloques:
Proc.new {|amount| puts "yay #{amount} !"}
- 1. Ruby: ¿es posible pasar un bloque como un param como un bloque real a otra función?
- 2. ¿Cómo pasar un bloque a otro en Ruby?
- 3. ¿Cómo pasar un vector a una función?
- 4. ¿Cómo pasar un archivo a una función?
- 5. ¿Pasar un operador a una función?
- 6. Imprimir el código fuente de un bloque de Ruby
- 7. Pasar múltiples bloques de código como argumentos en Ruby
- 8. ¿Cómo requerir un bloque en Ruby?
- 9. Python - Pasar una función a otra función
- 10. Ruby: bloque de rendimiento de un bloque?
- 11. ¿Cómo puedo pasar un evento a una función en C#?
- 12. ¿Cómo puedo pasar los parámetros a un bloque Symfony2 Twig?
- 13. ¿Puedo pasar un patrón a una función?
- 14. Reescribe la función simple de ruby para usar un bloque
- 15. Cómo pasar una matriz bidimensional a una función en C++
- 16. Pasar $ (esto) a una función
- 17. ¿Imprime el código real de Ruby de un bloque?
- 18. Cómo pasar un bloque como argumento a otro bloque en el Objetivo C
- 19. pasar una función a una función en Matlab
- 20. Usando 'return' en un bloque de Ruby
- 21. ¿Cómo sincronizo un bloque de código basado en una clave?
- 22. ¿Cómo pasar una lista a una función en R?
- 23. Cómo pasar una cadena a una función en Objective-C
- 24. ¿Cómo pasar un parámetro a una función Javascript establecida dinámicamente?
- 25. ¿Cómo pasar un puntero a una función con argumentos variables?
- 26. ruby debugger paso en un bloque directamente?
- 27. C: ¿Cómo pasar un doble puntero a una función
- 28. ¿Puede pasar más parámetros de los que espera una función?
- 29. ¿Cómo puedo pasar una matriz a una función en Perl?
- 30. ¿Cómo convierto un bloque a un proceso en una extensión Ruby 1.9 C?
Los bloques no son exactamente procesos. Tienen usos y sintaxis comunes, pero tienen suficientes diferencias de implementación como para causar un comportamiento confuso. Es un poco pedante, pero la diferencia de alcance me ha mordido antes. – fengb
@fengb Acabo de hacer una prueba. http://gist.github.com/242746 ¿Tiene más documentación sobre la diferencia entre Proc y block? Ruby me dice que un bloque es un Proc. –
Los bloques se "incrustan" de forma implícita en proc utilizando la sintaxis & var. Pero hay ciertas operaciones que se comportan de manera diferente cuando se usan como un bloque en comparación con un proceso. Comparación larga pero exhaustiva: http://innig.net/software/ruby/closures-in-ruby.rb – fengb