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/
?
davy.ai
Respuesta
No es posible crear alias del operador
Regexp#~
de manera que la expresiónhit /needle/
tenga el mismo resultado que~ /needle/
. El primer enfoque ingenuo de crear un alias en la claseRegexp
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 enObject
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.