es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

En Ruby, ¿cómo se puede aliasear el operador unario Regexp#~?

Jugando con la libertad que ofrece Ruby en sus características base, encontré bastante fácil aliasar la mayoría de los operadores usados en el lenguaje, pero el operador de prefijo unario Regexp#~ es más complicado.

Un primer enfoque ingenuo sería aliasar en la misma clase Regexp de la siguiente forma:

class Regexp
  alias hit ~@
  # Ten en cuenta que @ significa "versión de prefijo"
  # Una simple `alias_method :hit, :~@` dará el mismo resultado
end

Como se señaló en algunas respuestas más abajo, este enfoque funciona con la forma de llamada de notación de punto, como /needle/.hit. Sin embargo, intentar ejecutar hit /needle/ provocará un error de undefined method 'hit' for main:Object (NoMethodError).

Entonces, otro enfoque ingenuo sería definir este mismo método en Object, algo así como:

class Object
  def ~@(pattern)
    pattern =~ $_
  end
end

Sin embargo, esto no funcionará, ya que la variable global $_ está vinculada localmente y no mantendrá el valor que tiene en el contexto de llamada, es decir, $_ siempre es nil en el fragmento anterior.

Así que la pregunta es, ¿es posible que la expresión hit /needle/ devuelva el mismo resultado que ~ /needle/?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Respuesta

    No es posible crear alias del operador Regexp#~ de manera que la expresión hit /needle/ tenga el mismo resultado que ~ /needle/. El primer enfoque ingenuo de crear un alias en la clase Regexp en sí misma no funciona con la notación de punto y la forma regular de llamar al método. El segundo enfoque ingenuo de definir el método en Object tampoco funciona porque la variable global $_ está vinculada localmente y siempre será nil en el contexto del método.

    Por lo tanto, no parece haber una manera simple y directa de lograr este alias.

Comments are closed.