From: hal9000@... Date: 2000-06-09T23:06:04+00:00 Subject: [ruby-talk:03234] Questions re: "new" "+=" etc. Posting to the ng since I've temporarily lost email access... :( Every time I think I am starting to master Ruby, I run across things I don't understand. No flames, please, but I know C++, some Java, Object Pascal, and some Perl. I *don't* know Smalltalk, Scheme, CLU, Python or (much) Eiffel. This may relate to my occasional confusion. My comments here refer to the code fragment below. Firstly: I was trying to create an object that could be added to itself. I tried to implement the + operator, and I discovered that I could not invoke "new" from within the class -- see line (e). I assume this is a feature -- but why? I did find that lines (c) and (d) worked. I also found that line (b) worked -- this was an idiom I stole from someone's code. The method is defined on line (a), outside the class. Secondly: Since I implemented the + operator, the += operator should have been created for me. (And it was, as I confirmed.) But I can't alias anything to it. Line (f) works fine, as expected. Line (g) does not, nor does line (h), outside the class definition. Is += a "real" method or not? Thirdly: Line (i) requires parens -- not sure why -- see line (j). This tells me Wocka::+ is NOT defined. Line (l) tells me that x.+ is defined. The same attempts on Wocka::+= and x.+= (see lines (k) and (m)) both result in syntax errors. Comments? Hal Fulton ### --------------------- code ------------------------------ def Wocka(x) # Line (a) Wocka.new(x) end # Dummy class... # doesn't really do anything. class Wocka attr_accessor :data def initialize(x) @data = x end def + (other) case other.type.to_s when "Wocka" Wocka(@data + other.data) # Line (b) # self.type.new(@data + other.data) # Line (c) # type.new(@data + other.data) # Line (d) # new(@data + other.data) # Line (e) when "Fixnum" Wocka(@data + other) else raise "Adding an unsupported type to a Wocka object." end end alias add + # Line (f) # alias increase_by += # Line (g) def inspect "Data = " + @data.to_s end end # alias Wocka::increase_by Wocka::+= # Line (h) x = Wocka.new(20) y = Wocka.new(30) z = x + y p z x += y p x y += 13 p y # if defined? Wocka::+ # Line (i) if defined? (Wocka::+) # Line (j) print "Wocka::+ is defined\n" else print "Wocka::+ is NOT defined\n" end # if defined?(Wocka::+=) # Line (k) # print "Wocka::+= is defined\n" # else # print "Wocka::+= is NOT defined\n" # end if defined?(x.+) # Line (l) print "x.+ is defined\n" else print "x.+ is NOT defined\n" end # if defined?(x.+=) # Line (m) # print "x.+= is defined\n" # else # print "x.+= is NOT defined\n" # end Sent via Deja.com http://www.deja.com/ Before you buy.