how to aliase a module method?

X

Xavier Noria

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
 
D

dseiler

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 Aoki,
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.
 
A

ara.t.howard

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 Aoki,
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.

module M
class << self
alias_method 'dst', 'src'
end
end

-a
 
J

Jan Svitok

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 Davis' Ruby QuickRef
(http://www.zenspider.com/Languages/Ruby/QuickRef.html):

Aliasing

alias :new :eek:ld
alias_method :new, :eek:ld

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.
 
X

Xavier Noria

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 Aoki,
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
 
R

Rick DeNatale

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

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,237
Messages
2,571,189
Members
47,824
Latest member
MckinleyBu

Latest Threads

Top