Ruby, as Java, is pass-by-value... With a catch : the "value" that is passed is (in case of objects) the pointer reference, so should any modification on the object value be done inside the method, it will be on the same object that the one in the calling context.
Now, unto your examples, you need to know that FixNum are "immediate" objects that have only a value - the reference in this case is not the pointer but the object itself (it still is an object, with methods, etc, so this is not a primitive like in Java).
In your example, you are actually reassigning a new object to your "a" pointer, which will in all case not be reflected anywhere, the same way as :
my_name = "John"
my_name = "Robert"
is actually assigning a new pointer to the reference. As there is no way to change the value of a FixNum in Ruby, this is not a case that can work.
The situation with the array is what you probably expect : you have an object, you do a modification on the object state and get the modified state back.