[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Referring to an instance method using a variable

Jos Backus

8/11/2006 1:34:00 AM

As part of a larger program I am trying to convert the following Perl code to
Ruby:

lizzy:~% cat ptest
sub equals {
my($a, $b) = @_;
return $a eq $b ? 1 : 0;
}

my $ops = {
'=' => sub { my ($a, $b) = @_; return $a eq $b ? 1 : 0; },
'==' => \&equals,
};

print $ops->{'='}(1, 1);
print $ops->{'=='}(1, 2);
lizzy:~% perl -l ptest
1
0
lizzy:~%

This is what I have come up with:

lizzy:~% cat rtest
OPS = {
'=' => proc { |a, b| return a == b ? 1 : 0 },
'==' => proc { |a, b| send(:equals, a, b) },
}

def equals(a, b)
return a == b ? 1 : 0
end

puts OPS['='].call(1, 1)
puts OPS['=='].call(1, 2)
lizzy:~% ruby rtest
1
0
lizzy:~%

But the `==' case is rather ugly. Is there a shorter way than saying `proc {
|a, b| send(:equals, a, b) }'? I.e. is there a way to avoid using the proc
wrapper?

I guess one the problems is that unlike in Python, parentheses are optional
Ruby. This means that `equals' returns what I am looking for in Python but in
Ruby it causes `equals' to be called. (In Python one has to use `equals()' to
actually perform the call).

Ideas, anybody?

Thanks,
--
Jos Backus
jos at catnook.com

2 Answers

Gary Wright

8/11/2006 1:57:00 AM

0


On Aug 10, 2006, at 9:33 PM, Jos Backus wrote:
> This is what I have come up with:
>
> lizzy:~% cat rtest
> OPS = {
> '=' => proc { |a, b| return a == b ? 1 : 0 },
> '==' => proc { |a, b| send(:equals, a, b) },
> }
>
> def equals(a, b)
> return a == b ? 1 : 0
> end
>
> puts OPS['='].call(1, 1)
> puts OPS['=='].call(1, 2)
> lizzy:~% ruby rtest
> 1
> 0
> lizzy:~%

Is there supposed to be a semantic difference between the '=' and '=='
operator in what you are trying to accomplish or are you just trying to
implement '=' as a proc and '==' as a method?

Does this help at all?

def equals(a, b)
return a == b ? 1 : 0
end

OPS = {
'=' => proc { |a, b| return a == b ? 1 : 0 },
'==' => method(:equals),
}

puts OPS['='].call(1, 1)
puts OPS['=='].call(1, 2)


Gary Wright




Jos Backus

8/11/2006 4:37:00 AM

0

On Fri, Aug 11, 2006 at 10:56:45AM +0900, gwtmp01@mac.com wrote:
> Is there supposed to be a semantic difference between the '=' and '=='
> operator in what you are trying to accomplish or are you just trying to
> implement '=' as a proc and '==' as a method?

The latter. It's just an example. They are operators in a templating language
we use at work.

>
> Does this help at all?
>
> def equals(a, b)
> return a == b ? 1 : 0
> end
>
> OPS = {
> '=' => proc { |a, b| return a == b ? 1 : 0 },
> '==' => method(:equals),
> }
>
> puts OPS['='].call(1, 1)
> puts OPS['=='].call(1, 2)

It sure does. But I could have sworn I tried that, which is why I posted :-/
Guess not.

Thanks Gary!

--
Jos Backus
jos at catnook.com