Me gustaría pasar un argumento (s) a un método que se define utilizando define_method, ¿cómo lo haría?¿Cómo se pasan los argumentos para definir_metodo?
Respuesta
El bloque que pase a definir_metodo puede incluir algunos parámetros. Así es como su método definido acepta argumentos. Cuando defines un método, en realidad estás poniendo el sobrenombre al bloque y manteniendo una referencia a él en la clase. Los parámetros vienen con el bloque. Por lo tanto:
Además de la respuesta de Kevin Conner: los argumentos de bloque no admiten la misma semántica que los argumentos de método. No puede definir argumentos predeterminados o argumentos de bloque.
Esto solo se soluciona en Ruby 1.9 con la nueva sintaxis alternativa "stabby lambda" que admite la semántica de argumento de método completo.
Ejemplo:
# Works
def meth(default = :foo, *splat, &block) puts 'Bar'; end
# Doesn't work
define_method :meth { |default = :foo, *splat, &block| puts 'Bar' }
# This works in Ruby 1.9 (modulo typos, I don't actually have it installed)
define_method :meth, ->(default = :foo, *splat, &block) { puts 'Bar' }
En realidad, creo que los argumentos de bloque en definir_metodo son compatibles con splat, que también proporciona una forma de redondear una ronda para definir los argumentos predeterminados. – Chinasaur
Chinasaur tiene razón sobre los argumentos de bloque que permiten splats. Lo he confirmado tanto en Ruby 1.8.7 como en 1.9.1. –
Gracias, me olvidé de esto. Corregido ahora. –
... y si quieres parámetros opcionales
class Bar
define_method(:foo) do |arg=nil|
arg
end
end
a = Bar.new
a.foo
#=> nil
a.foo 1
# => 1
... tantos argumentos como que desea
class Bar
define_method(:foo) do |*arg|
arg
end
end
a = Bar.new
a.foo
#=> []
a.foo 1
# => [1]
a.foo 1, 2 , 'AAA'
# => [1, 2, 'AAA']
combinación de ...
class Bar
define_method(:foo) do |bubla,*arg|
p bubla
p arg
end
end
a = Bar.new
a.foo
#=> wrong number of arguments (0 for 1)
a.foo 1
# 1
# []
a.foo 1, 2 ,3 ,4
# 1
# [2,3,4]
... todos ellos
class Bar
define_method(:foo) do |variable1, variable2,*arg, &block|
p variable1
p variable2
p arg
p block.inspect
end
end
a = Bar.new
a.foo :one, 'two', :three, 4, 5 do
'six'
end
actualización
Rubí 2.0 introdujo doble splat **
(dos estrellas), que (I quote) hace:
Rubí 2.0 introdujo argumentos de palabra clave y ** actúa como *, pero para argumentos de palabra clave. Devuelve un Hash con pares clave/valor.
... y por supuesto que se puede utilizar en el método de definir también :)
class Bar
define_method(:foo) do |variable1, variable2,*arg,**options, &block|
p variable1
p variable2
p arg
p options
p block.inspect
end
end
a = Bar.new
a.foo :one, 'two', :three, 4, 5, ruby: 'is awesome', foo: :bar do
'six'
end
# :one
# "two"
# [:three, 4, 5]
# {:ruby=>"is awesome", :foo=>:bar}
atributos con nombre ejemplo:
class Bar
define_method(:foo) do |variable1, color: 'blue', **other_options, &block|
p variable1
p color
p other_options
p block.inspect
end
end
a = Bar.new
a.foo :one, color: 'red', ruby: 'is awesome', foo: :bar do
'six'
end
# :one
# "red"
# {:ruby=>"is awesome", :foo=>:bar}
yo estaba tratando de crear ejemplo, con argumento de palabra clave, splat y doble splat todo en uno:
define_method(:foo) do |variable1, variable2,*arg, i_will_not: 'work', **options, &block|
# ...
o
define_method(:foo) do |variable1, variable2, i_will_not: 'work', *arg, **options, &block|
# ...
... pero esto no funcionará, parece que hay una limitación. Cuando lo piense, tiene sentido ya que el operador de splat está "capturando todos los argumentos restantes" y double splat está "capturando todos los argumentos de palabra clave restantes", por lo tanto, mezclarlos rompería la lógica esperada. (No tengo ninguna referencia para probar este punto doh!)
Interesante - especialmente el 4 ° bloque: ¡funcionó en 1.8.7! El primer bloque no funcionó en 1.8.7, y el segundo bloque tiene un error tipográfico (debe ser 'a.foo 1' en lugar de' foo 1'). ¡Gracias! –
gracias por sus comentarios, el error fue corregido, ... En ruby 1.9.3 y 1.9.2 todos los ejemplos funcionan y estoy seguro de que en 1.9.1 también (pero no lo intenté) – equivalent8
Combiné esta respuesta con la respuesta aceptada en http://stackoverflow.com/questions/4470108/when-monkey-patching-a-method-can-you-call-the-overridden-method-from-the-new-i para averiguar cómo sobrescribir (no anular) un método en tiempo de ejecución que toma args opcionales y un bloque y aún así puede llamar al método original con args y block. Ah, ruby. Específicamente, necesitaba sobreescribir Savon :: Client.request en mi env env para una única llamada API a un host al que solo puedo acceder en producción. ¡Aclamaciones! – pduey
Con 2.2 ahora se puede utilizar argumentos de palabra clave: https://robots.thoughtbot.com/ruby-2-keyword-arguments
define_method(:method) do |refresh: false|
..........
end
- 1. ¿Cómo se pasan los argumentos de función en C?
- 2. Argumentos de la aplicación de consola, cómo se pasan los argumentos al método principal
- 3. ¿Cómo se pasan los parámetros desde xaml?
- 4. ¿Por qué se lanza un error cuando los argumentos se pasan a mi script de ruby?
- 5. argumentos pasan de matriz en PHP para el constructor
- 6. ¿Por qué sp_executesql correr más lento cuando se pasan los parámetros como argumentos
- 7. ¿Cómo se pasan las matrices?
- 8. Parámetro '@home' mensaje especificado pero ninguno de los argumentos que se pasan ... Error
- 9. PHP Soap llamada no WSDL: ¿cómo se pasan los parámetros?
- 10. ¿Cómo se pasan los parámetros de PUT a una página?
- 11. método de cómo enumerar pasan los parámetros
- 12. Tipos alineados y argumentos que pasan por valor
- 13. que pasan los parámetros de línea de comandos para apuntar que los utiliza en exec
- 14. a encontrar las palabras clave de los argumentos de hecho pasan a un método de Python
- 15. ¿Se pasan los objetos ColdFusion por referencia o por valor?
- 16. ¿Se pasan los bools de Python por valor?
- 17. Tratar de definir mis reguladores como el servicio en Symfony2 - los argumentos que nunca se pasan al constructor
- 18. ¿Cómo se pasan los valores de los objetos .net en F #?
- 19. ¿Cómo se pasan los parámetros de visualización cuando se navega desde una acción en JSF2?
- 20. ¿Cuáles son los argumentos para main() para?
- 21. ¿Qué son los corchetes angulares para los valores de los argumentos y para qué se utilizan?
- 22. ¿Se pasan objetos PHP5 por referencia?
- 23. ¿Cómo se pasan múltiples valores enum en C#?
- 24. ¿Cómo se pasan los parámetros (desde javascript) a remoteCommand (y luego se lo envía a los beans de respaldo)?
- 25. Cómo se pasan las cadenas al método .like() de SQLAlchemy
- 26. ¿Cómo se indican los argumentos inválidos en Python?
- 27. ¿Cómo se sincroniza automáticamente cuando pasan las pruebas automatizadas?
- 28. ¿Cómo se pasan las variables de C# a javascript?
- 29. Cómo pasar los argumentos opcionales
- 30. ¿Cómo se pasan datos a un IValueConverter en XAML?
Bueno, eso es sólo una cosa de Beaty no adulterada pura. Buen trabajo, Kevin Costner. – Fuser97381