[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Method names and alias

darren kirby

8/31/2007 7:48:00 PM

Hello all,

In Unix, you can create a symlink to an executable, and have the program
behave differently depending on how it was called by testing argv[0]. I would
like to do something similar with Ruby methods using alias.

I have many methods which come in pairs, a version each for signed and
unsigned numbers. These methods differ by only one line, eg:

def load_byte(destination, base_address, offset)
<snip 15 lines>
@registers.gen[destination] = bitstring_to_int(byte)
true
end

def load_byte_unsigned(destination, base_address, offset)
<snip 15 lines>
@registers.gen[destination] = bitstring_to_int(byte, signed=false)
true
end

My code would be considerably DRYer if I could make 'load_byte_unsigned' an
alias to 'load_byte', and have the method inspect the name it was called as
to decide if it should run 'bitstring_to_int(byte, signed=false)' or not.

Is there a way to do this?

If not, I suppose my best bet is to move the snipped 15 lines to
a 'load_byte_common' method and make 'load_byte' and 'load_byte_unsigned'
thin wrappers around it?

Thanks for consideration,
-d
--
darren kirby :: Part of the problem since 1976 :: http://badco...
"...the number of UNIX installations has grown to 10, with more expected..."
- Dennis Ritchie and Ken Thompson, June 1972

4 Answers

hemant

9/1/2007 4:10:00 AM

0

On 9/1/07, darren kirby <bulliver@badcomputer.org> wrote:
> Hello all,
>
> In Unix, you can create a symlink to an executable, and have the program
> behave differently depending on how it was called by testing argv[0]. I would
> like to do something similar with Ruby methods using alias.
>
> I have many methods which come in pairs, a version each for signed and
> unsigned numbers. These methods differ by only one line, eg:
>
> def load_byte(destination, base_address, offset)
> <snip 15 lines>
> @registers.gen[destination] = bitstring_to_int(byte)
> true
> end
>
> def load_byte_unsigned(destination, base_address, offset)
> <snip 15 lines>
> @registers.gen[destination] = bitstring_to_int(byte, signed=false)
> true
> end
>
> My code would be considerably DRYer if I could make 'load_byte_unsigned' an
> alias to 'load_byte', and have the method inspect the name it was called as
z> to decide if it should run 'bitstring_to_int(byte, signed=false)' or not.

Well this is your problem, "have the method inspect the name it was
called as". I guess if you really want to DRY them up ( although the
other approach you suggested sounds good enough), you can use
method_missing and capture method names and do stuff based on that.

Also, if there is a way to determine method that you intend to call
based on argument data type, then you can inspect your arguments and
do DRY stuff. But i guess you would have already thought out that
possibility. Anyways...

>
> Is there a way to do this?
>
> If not, I suppose my best bet is to move the snipped 15 lines to
> a 'load_byte_common' method and make 'load_byte' and 'load_byte_unsigned'
> thin wrappers around it?
>
> Thanks for consideration,
> -d
> --
> darren kirby :: Part of the problem since 1976 :: http://badco...
> "...the number of UNIX installations has grown to 10, with more expected..."
> - Dennis Ritchie and Ken Thompson, June 1972
>
>


--
Let them talk of their oriental summer climes of everlasting
conservatories; give me the privilege of making my own summer with my
own coals.

http://blog.g...

Phrogz

9/1/2007 5:13:00 AM

0

On Aug 31, 1:47 pm, darren kirby <bulli...@badcomputer.org> wrote:
> My code would be considerably DRYer if I could make 'load_byte_unsigned' an
> alias to 'load_byte', and have the method inspect the name it was called as
> to decide if it should run 'bitstring_to_int(byte, signed=false)' or not.
>
> Is there a way to do this?

I can't offer you a way to do this, but:

> If not, I suppose my best bet is to move the snipped 15 lines to
> a 'load_byte_common' method and make 'load_byte' and 'load_byte_unsigned'
> thin wrappers around it?

I'd personally do something like:

def load_byte( byte, unsigned=false )
#...your code here...
end

def load_byte_unsigned( byte )
load_byte( byte, true )
end

A (private?) utility function is certainly possible, but not the way
I'd go, or needed.

Peña, Botp

9/1/2007 7:12:00 AM

0

From: darren kirby [mailto:bulliver@badcomputer.org]
# def load_byte(destination, base_address, offset)
# <snip 15 lines>
# @registers.gen[destination] = bitstring_to_int(byte)
# true
# end
#
# def load_byte_unsigned(destination, base_address, offset)
# <snip 15 lines>
# @registers.gen[destination] = bitstring_to_int(byte, signed=false)
# true
# end

def load_byte(destination, base_address, offset, signed=true)
<snip 15 lines>
@registers.gen[destination] = bitstring_to_int(byte,signed)
true
end

load_byte(destination, base_address, offset) #signed
load_byte(destination, base_address, offset, signed=false) #unsigned


darren kirby

9/1/2007 5:59:00 PM

0

quoth the Phrogz:
> On Aug 31, 1:47 pm, darren kirby <bulli...@badcomputer.org> wrote:
> > My code would be considerably DRYer if I could make 'load_byte_unsigned'
> > an alias to 'load_byte', and have the method inspect the name it was
> > called as to decide if it should run 'bitstring_to_int(byte,
> > signed=false)' or not.
> >
> > Is there a way to do this?
>
> I can't offer you a way to do this, but:
> > If not, I suppose my best bet is to move the snipped 15 lines to
> > a 'load_byte_common' method and make 'load_byte' and 'load_byte_unsigned'
> > thin wrappers around it?
>
> I'd personally do something like:
>
> def load_byte( byte, unsigned=false )
> #...your code here...
> end
>
> def load_byte_unsigned( byte )
> load_byte( byte, true )
> end

Thanks Phrogz,

This gives me some ideas on how to clean up the code a bit.

@Hemant:

I guess I was hoping there may have been some "if self.name == "load_byte"
magic that I could have used.

@Pena:

Thanks, but I cannot change the name of the method, that is, there must be an
unsigned counterpart, as I am writing methods which emulate Mips32 ISA and I
want my methods to match the ops...the real methos names are 'lb, and 'lbu'
so...

-d
--
darren kirby :: Part of the problem since 1976 :: http://badco...
"...the number of UNIX installations has grown to 10, with more expected..."
- Dennis Ritchie and Ken Thompson, June 1972