¿Por qué a veces debo usar bloque y otras veces & bloque dentro de funciones que aceptan bloques?Diferencia entre bloque y bloqueo en Ruby
Respuesta
block
es solo una variable local, &block
es una referencia al bloque pasado al método.
def foo(block = nil)
p block
end
foo # => nil
foo("test") # => test
foo { puts "this block will not be called" } # => nil
def foo(&block)
p block
end
foo # => nil
foo("test") # => ArgumentError: wrong number of arguments (1 for 0)
foo { puts "This block won't get called, but you'll se it referenced as a proc." }
# => #<Proc:[email protected]:20>
También puede utilizar &block
cuando se llama a métodos para pasar un proc como un bloque a un método, por lo que se puede utilizar procsos tal como se utiliza bloques.
my_proc = proc {|i| i.upcase }
p ["foo", "bar", "baz"].map(&my_proc)
# => ["FOO", "BAR", "BAZ"]
p ["foo", "bar", "baz"].map(my_proc)
# => ArgumentError: wrong number of arguments (1 for 0)
El nombre de la variable block
no significa nada especial. Puede usar &strawberries
si lo desea, el símbolo comercial es la clave aquí.
Puede que encuentre this article útil.
+1 para '' '& strawberries''' – raycchan
Añadiré: es similar a cómo se usa el operador splat (es decir, '*') para arreglos:' def foo (* args) ; other_foo (* args); end' tomará una matriz arbitraria de argumentos, y luego pasará esa misma matriz a la llamada de función interna. Con bloques, harías 'def foo (& block); other_foo (y bloque); fin –
En una lista de argumentos, &whatever
toma el bloque que se pasó al método y lo envuelve en un objeto Proc. El Proc se almacena en una variable llamada whatever
(donde puede ser cualquier nombre que haya tipeado después del signo y, por supuesto, generalmente es "bloque"). Después de una llamada a un método, la sintaxis &whatever
convierte un Proc en un bloque. Así que si se define un método de este modo:
def thing(&block)
thing2 &block
end
se está definiendo un método que toma un bloque y luego llama a otro método con ese bloque.
Si no configura el & antes del bloque, Ruby no reconocerá su relación con el "bloque" que pasa a la función. Aquí algunos ejemplos.
def f(x, block); end
f(3) { 2+2 } # gives an error, because "block" is a
# regular second argument (which is missing)
def g(x, &block); end
g(3) { 2+2 } # legal
def h(x); end
h(3) { 2+2 } # legal
para su uso posterior en una función:
def x(&block) # x is a 0 param function
y(block) # y is a 1 param function (taking one "Proc")
z(&block) # z is a 0 param function (like x) with the block x received
end
Por lo tanto, si se llama a z(&block)
es (casi !!) lo mismo que llamar z { yield }
: Usted sólo tiene que pasar el bloque a la siguiente función.
- 1. Diferencia entre bloqueo (taquilla) y bloqueo (variable_which_I_am_uso)
- 2. Diferencia entre monitor y bloqueo?
- 3. Diferencia entre "y" y && en Ruby?
- 4. ¿Diferencia entre <=> y == en Ruby?
- 5. Diferencia entre downcase y downcase! en Ruby
- 6. Ruby: Diferencia entre Instancia y variables locales en Ruby
- 7. Ruby - Diferencia entre: variable y @variable
- 8. ¿Cuál es la diferencia entre Ruby y Ruby on Rails?
- 9. ¿Cuál es la diferencia entre un método sincronizado y un bloque sincronizado en Java?
- 10. ¿Diferencia entre el bloqueo sincronizado y el reentrante?
- 11. ¿Cuál es la diferencia entre bloqueo y Mutex?
- 12. Diferencia entre el bloqueo (esto) y un bloqueo en el objeto estático
- 13. Definición de bloque: diferencia entre llaves y do-end?
- 14. ¿Cuál es la diferencia entre sincronizado en lockObject y usando esto como el bloqueo?
- 15. Diferencia entre un bloque y un bloque de especificar en RSpec
- 16. Diferencia entre '' y "" en Python
- 17. ¿Diferencia entre == y caso?
- 18. Obtener diferencia entre matrices en Ruby
- 19. Diferencia entre el mapa y coleccionar en Ruby?
- 20. ¿Cuál es la diferencia entre STDIN y $ stdin en Ruby?
- 21. ¿Cuál es la diferencia entre require_relative y require en Ruby?
- 22. ¿cuál es la diferencia entre salir y salir? en ruby?
- 23. Diferencia entre lambda y method_name def en Ruby
- 24. ¿Cuál es la diferencia entre% Q y% {} en ruby?
- 25. ¿Cuál es la diferencia entre Class y Klass en ruby?
- 26. Diferencia en cifrado blowfish entre perl y ruby
- 27. ¿Cuál es la diferencia entre include y require en Ruby?
- 28. ¿Cuál es la diferencia entre Object y BasicObject en Ruby?
- 29. ¿Cuál es la diferencia entre incluir y extender en Ruby?
- 30. ¿Hay alguna diferencia entre el "bloqueo" de Java y el "bloqueo" de C#?
Muy buena Pregunta @collimarco –