If self refers to the object created by instantiating its current class.
Why does self in this case equal a?
We instantiated twice? We have 2 objects?
Your code is incomplete, and I don’t quite understand all of your
questions.
I assume that the first class (where you did not provide the full code)
is the class Animal.
We have three instanciations.
First, a Zebra is instanciated and assigned to a.
Second, another Zebra is instanciated and assigned to b.
Then, the method + is invoked on a. Inside the method body, self is
bound to receiver, which is the object a. Hence. self.name means the
name of the Zebra a.
During the execution of +, a Animal is instantiated and returned as a
result of the + method.
This Animal is then passed to puts.