Saltar al contenido

Ruby: cómo encadenar múltiples llamadas a métodos junto con “enviar”

Solución:

Me encontré con esto y realmente pide inyectar:

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

Aqui no no es una forma incorporada de hacer esto. Lo que hiciste es lo suficientemente simple y conciso, por no mencionar peligroso. Tenga cuidado al usarlo.

En otro pensamiento, esto se puede extender para aceptar argumentos también:

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

Luego puede usar el método de esta manera:

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

Este método también acepta argumentos únicos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *