From: Julien Gaugaz Date: 2006-12-22T01:07:59+09:00 Subject: Method named ***(other) 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:in `each' from (irb):23:in `collect2' from (irb):22:in `each' 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