Tengo 2 objetos con propiedades similares, ¿puedo usar enviar así de forma segura?

if ...
  o = User
elseif ...
  o = Car


o.send(:count) = 100
o.send(:is_high) = true

o.save!

Quiero reducir el código duplicado, ¿está bien hacerlo?

Tendré pruebas para esto en caso de que los nombres de las propiedades cambien, etc.

preguntado el 27 de agosto de 11 a las 21:08

Debería haber dicho por qué pensó que esto no funcionaría. -

Por cierto, el código ruby ​​que proporcionas no es válido, por ejemplo, elseif. -

2 Respuestas

"Hacer" o.send(:count) = 100 le dará un error de sintaxis, por lo que presumiblemente quiere decir esto:

o.send(:count=, 100)
o.send(:is_high=, true)

Sí, está bien, pero dejará a las personas que mantienen su código rascándose la cabeza y preguntándose por qué no hicieron esto:

o.count   = 100
o.is_high = true

Usualmente solo usas send cuando no conoce el nombre del método hasta el tiempo de ejecución:

m = want_pancakes ? :pancakes : :eggs
o.send(m, true)

Respondido 28 ago 11, 01:08

No, eso no está bien porque el :count El método getter es diferente del :count= método setter. Podrías hacer esto:

o.send(:count=, 100)

Ruby es un lenguaje escrito dinámicamente. No necesitas usar send, puede llamar directamente a los métodos:

o = if ...
  User
elsif ...
  Car
end

o.count = 100
o.is_high = true
o.save!

Respondido 28 ago 11, 01:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.