tutorial rails method español desde define_method define cero ruby metaprogramming

rails - Ruby: Cómo encadenar múltiples llamadas de método con "enviar"



ruby on rails tutorial español pdf (3)

Me acabo de encontrar esto y realmente me pide inyectar:

def send_chain(arr) arr.inject(self) {|o, a| o.send(a) } end

Tiene que haber una forma incorporada de hacer esto, ¿verdad?

class Object def send_chain(arr) o=self arr.each{|a| o=o.send(a) } return o end end


No, no hay una forma integrada de hacer esto. Lo que hiciste es simple y conciso, por no decir peligroso. Tenga cuidado al usarlo.

Pensándolo bien, esto también se puede extender para aceptar argumentos:

class Object def send_chain(*args) o=self args.each do |arg| case arg when Symbol, String o = o.send arg # send single symbol or string without arguments when Array o = o.send *arg # smash the inner array into method name + arguments else raise ArgumentError end end return o end end

esto le permitiría pasar un nombre de método con sus argumentos en una matriz, como;

test = MyObject.new test.send_chain :a_method, [:a_method_with_args, an_argument, another_argument], :another_method


Sobre la base de respuestas anteriores, en caso de que necesite pasar argumentos a cada método, puede usar esto:

def send_chain(arr) Array(arr).inject(self) { |o, a| o.send(*a) } end

A continuación, puede utilizar el método de esta manera:

arr = [:to_i, [:+, 4], :to_s, [:*, 3]] ''1''.send_chain(arr) # => "555"

Este método acepta argumentos individuales también.