Estoy tratando de crear un pequeño hacha de Ruby para hacer algo así como el reverso del Symbol # to_proc hack. Mientras que el hack símbolo # to_proc lo hace posible:Ruby to_proc hack con enlace
some_array.each(&:some_method)
es lo mismo que
some_array.each { |obj| obj.some_method }
Quiero que esto sea posible:
some_array.each(&[:some_method])
sería el mismo que
some_array.each { |obj| some_method(obj) }
El problema es que a menos que some_method es un método kernel, lo que realmente significaría es:
some_array.each { |obj| self.some_method(obj) }
Cuando un bloque se pasa de forma explícita, se ha creado dentro de la unión donde se escribe esta línea, por lo que la auto accesos correctamente las obras objeto y todo actuales multa. Sin embargo, si el bloque se crea en el método to_proc de la matriz, el self está dentro del enlace Array (y se refiere a la matriz en sí). Tal vez no sea posible hacer lo que estoy tratando de hacer, pero me encantaría algunas ideas de la comunidad.
Aquí está mi truco hasta el momento. Esto funciona siempre y cuando el método es un método de núcleo, y está disponible dentro de la agrupación:
class Array
def to_proc
lambda {|i| send(self.first, i)}
end
end
Con este truco, funciona de esta línea, y pone las tres símbolos:
[:foo, :bar, :bas].each(&[:puts])
Es útil para mí ya, porque a menudo me encuentro queriendo inspeccionar una variedad de objetos ActiveRecord dentro de la consola y me ahorra tipear {| i | pone i}. Pero sería aún más útil poder usarlo dentro de los objetos para que se llame a algún método dentro del objeto con cada elemento de la matriz pasado como parámetro.
¿Alguna idea de cómo hacer que funcione el enlace?
Por favor, no responda con "no quiere hacer esto porque hará que las cosas funcionen más despacio" o "no está guardando tantos caracteres escribiendo, pero hace que el código sea menos legible" - - Ya sé estas cosas. :) Esto es más una especie de hack de alimentación de mi curiosidad. Me pregunto si es posible.
¿podría usted elegir una respuesta? : p Solo noto esto q. obtuve cierto interés, por lo que sería bueno que seleccionara la respuesta que mejor respondiera a su pregunta. – horseyguy
Buen punto. Quería ver si alguien tiene una respuesta sobre cómo hacer que funcione realmente el enlace, como en mi pregunta original. Pero supongo que no es posible de la forma en que estaba tratando de hacerlo, ya que el truco to_proc está dentro de otro objeto (Array). –
no sé a qué te refieres con "trabajar el enlace" pero recuperaré la respuesta que tenía, que hace algunas cosas con un enlace, pero realmente no es tan limpio y agradable como el enfoque 'method()' – horseyguy