How to aliase a module method?

I am trying to aliase a module method to some local alias (to ease
some template). I’ve tried a few variations of

alias escape_latex MyUtils.escape_latex

without luck so far. I could mixin the module or write a wrapper, but
I’d like to know how to accomplish that with alias, or that it is not
possible if that’s the case.

– fxn

On Mar 8, 5:34 am, Xavier N. [email protected] wrote:

I am trying to aliase a module method to some local alias (to ease
some template). I’ve tried a few variations of

alias escape_latex MyUtils.escape_latex

without luck so far. I could mixin the module or write a wrapper, but
I’d like to know how to accomplish that with alias, or that it is not
possible if that’s the case.

It’s possible, sort of. Try

module TheModule
instance_eval “alias escape_latex MyUtils.escape_latex”
end

I use a similar technique (originally suggested by Minero A.,
according to my notes) to replace Thread.critical and
Thread.critical=. I’ve only tested it in 1.8.2 but I don’t think
anything’s broken it since then.

On Fri, 9 Mar 2007 [email protected] wrote:

It’s possible, sort of. Try

– fxn
module M
class << self
alias_method ‘dst’, ‘src’
end
end

-a

On 3/8/07, Xavier N. [email protected] wrote:

I am trying to aliase a module method to some local alias (to ease
some template). I’ve tried a few variations of

alias escape_latex MyUtils.escape_latex

without luck so far. I could mixin the module or write a wrapper, but
I’d like to know how to accomplish that with alias, or that it is not
possible if that’s the case.

first of all, you need to use symbols for methods (actually, you just
refer to the names of the methods):

alias :escape_latex :MyUtils.escape_latex

Can you see the problem: how you’d write the symbol for
MyUtils.escape_latex? This is not the way.
Now, this is excerpt from Ryan D.’ Ruby QuickRef
(Ruby | zenspider.com | by ryan davis):

Aliasing

alias :new :old
alias_method :new, :old

Creates a new reference to whatever old referred to. old can be any
existing method, operator, global. It may not be a local, instance,
constant, or class variable.

The simple solution would be in this case (provided you don’t mind
including the other methods of the module):

include MyUtils

PS: I’ve tried

module TheModule
instance_eval “alias escape_latex MyUtils.escape_latex”
end

and I got:

(eval):1: parse error, unexpected ‘.’, expecting $
alias escape_latex MyUtils.escape_latex
^(pointing at the dot)

I don’t think it’d work, but I may be wrong, and will be glad if
somebody
will show the working code for this.

On Mar 9, 2007, at 12:17 AM, Jan S. wrote:

first of all, you need to use symbols for methods (actually, you just
refer to the names of the methods):

No, that’s not true.

– fxn

On 3/8/07, Xavier N. [email protected] wrote:

possible if that’s the case.
anything’s broken it since then.
alias foo Math.sqrt
Because alias requires that both arguments be names (or symbols), Note
that it’s not a method but is directly performed by the ruby
interpreter.

irb(main):001:0> alias foo Math.sqrt
SyntaxError: compile error
(irb):1: parse error, unexpected ‘.’, expecting $
alias foo Math.sqrt
^
from (irb):1

You’re not even getting to eval.c, it’s failing to parse.

Module#alias_method requires that it’s aruments be symbols
cooresponding to the name.

The other problem is that you are trying to make a name in a different
scope than the name you are aliasing. As far as I can see this isn’t
possible.


Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

On Mar 9, 2007, at 12:10 AM, [email protected] wrote:

It’s possible, sort of. Try

module TheModule
instance_eval “alias escape_latex MyUtils.escape_latex”
end

I use a similar technique (originally suggested by Minero A.,
according to my notes) to replace Thread.critical and
Thread.critical=. I’ve only tested it in 1.8.2 but I don’t think
anything’s broken it since then.

I don’t understand that technique (it is not working here). In fact
what I don’t understand is alias.

In irb we can do

alias foo sprintf

Why can’t we say

alias foo Math.sqrt

? Having a quick glance at eval.c I think the problem is that alias
is syntax (that’s why it does not need a comma between its
“arguments”) and I guess here’s the key:

case NODE_ALIAS:
if (NIL_P(ruby_class)) {
rb_raise(rb_eTypeError, “no class to make alias”);
}
rb_alias(ruby_class, rb_to_id(rb_eval(self, node->u1.node)),
rb_to_id(rb_eval(self, node->u2.node)));

– fxn