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.