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.