From: Josh Cheek Date: 2010-01-18T11:42:50+09:00 Subject: Re: basic question: passing a modifiable argument to a routine --000e0cd1549e1cbef6047d674f6c Content-Type: text/plain; charset=ISO-8859-1 On Sun, Jan 17, 2010 at 7:00 PM, lalawawa wrote: > Arguments to subroutines seem to be passed by value in ruby > > $ irb > irb(main):001:0> def woof(a) > irb(main):002:1> a += 2 > irb(main):003:1> end > => nil > irb(main):004:0> b = 5 > => 5 > irb(main):005:0> woof(b) > => 7 > irb(main):006:0> b > => 5 > irb(main):007:0> > They are actually pass by reference, as in Java and C++, or arrays in C. For example def woof(a) a << "e" end a = "bcd" woof(a) a # => "bcde" Your example does not reflect this, because of two issues. The first is that numbers are immutable, so even though you can modify the objects themselves, you can't modify numbers. The second is that += does not modify the object itself, it modifies the label. It is the same as saying a=a+1 This is because of the first reason, since they are immutable you must do a=a+1 instead of a++ On Sun, Jan 17, 2010 at 7:00 PM, lalawawa wrote: > so how do I pass a variable to a routine if I want the routine to > modify the variable. In C I would say: > > void woof(int *a) { > *a += 2; > } > int b = 5; > woof(&b); > printf("%d\n", b); > > would output 7. > Honestly, I don't ever really find myself in situations where I need to do this, you may need to rethink your approach. Regardless, I suppose I can think of three alternatives. Alternative 1 is to use an instance variable, don't do this trivially, they will pollute your namespace. def woof @a+=2 end @a = 2 woof @a # => 4 Alternative 2 is to have the method return the new value ie, it seems a little messy, though, since it requires code outside to know that it needs to assign results in some given manner. def woof(a) a+2 end a = 2 a = woof(a) a # => 4 Alternative 3 is to wrap the variable in a mutable object, like Java's Integer (except that isn't mutable either :P), but I can't seem to come up with a way of doing this that I don't hate. If you care to show your example, we might be able to spot a more Ruby approach. --000e0cd1549e1cbef6047d674f6c--