Hi!

It’s several hours now that i’m trying to find out what’s special with

*** for a method name, without success

I’m trying to add an element wise multiplication method to the Matrix

class. For this I created a collect2 method for Matrix similar to the

one in Vector as follows:

class Matrix

def collect2(other)

result = self.clone

(0…self.row_size).each {|rowi|

(0…self.column_size).each {|columni|

result[rowi,columni] = yield (self[rowi,columni],

other[rowi,columni])

}

}

result

end

def []=(i,j,v)

@rows[i][j] = v

end

end

And i would like now to add a method *** to Matrix such that we could

call matrix1 *** matrix2. Like:

m = Matrix[[1,2,3],[-1,-2,-3], [4,5,6]]

n = Matrix[[1,2,3],[7,8,9], [-1,-2,-3]]

m *** n

=> Matrix[[1, 4, 9], [-7, -16, -27], [-4, -10, -18]]

Now if I define this method as follows:

def ***(other)
collect2(other) do |e1,e2|
if(e1 and e2)
e1*e2

end

end

end

I get the following error:

SyntaxError: compile error

(irb):550: parse error, unexpected tLPAREN, expecting ‘\n’ or ‘;’

def ***(other)

^

(irb):557: parse error, unexpected kEND, expecting $

from (irb):557

from :0

The same with def *** other works (I can define it without error).

But now a call to m *** n gives me:

SyntaxError: compile error

(irb):33: parse error, unexpected tSTAR

m *** n

^

from (irb):33

from :0

And m.*** n (notice the period after m) gives:

TypeError: Array can’t be coerced into Fixnum

from (irb):8:in `*' from (irb):8:in`

**’
from (irb):24:in collect2' from (irb):23:ineach’
from (irb):23:in collect2' from (irb):22:ineach’
from (irb):22:in collect2' from (irb):6:in**’

from (irb):35

from :0

Whereas if I name the method with two stars only, i.e. def **(other), it

can be defined, and then m ** n gives the expected result.

I therefore have the following questions:

- Why is it possible to define def *** other but not def ***(other) ?
- What is the difference between m.*** n and m *** n (with and without

period after m) ? - Why do I get an error with m.*** n (with period) but not with m ** n ?

I would greatly appreciate any answer of pointers to some information

sources (I tried but it is not easy to search for *** in a web search

engine )

Thanks a lot in advance for your help and advices!

Julien