From: Florian Gross Date: 2005-01-19T07:16:04+09:00 Subject: Re: value by reference --------------020303080603080601040904 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Mohammad Khan wrote: > Before telling my issue, let me show my script: > > def do_something(a, b, c) > a = a + 1 > b = b + 2 > c = c + 3 > end > a, b, c = 5, 6, 7 > puts "before do_something:" > I would like to see the value of a, b, c after calling #do_something as: > a = 6, b = 8, c = 10 > > how can I do it without making a, b, c an instance variable? > In other words, how can I send value by reference? This is not easily done. First of all you should ask yourself why you find yourself needing it and if there is not a better mechanism in Ruby that you could use to accomplish your goal. (Methods can return multiple values.) After that there's two approaches to addressing the above: 1) Supply lambdas: def do_something(inc_a, inc_b, inc_c) inc_a.call(1) inc_b.call(1) inc_c.call(1) end do_something( lambda { |x| a += x }, lambda { |x| b += x }, lambda { |x| c += x } ) 2) Use variable.rb to handle variables as Objects: def do_something(a, b, c) a.value += 1 b.value += 1 c.value += 1 end do_something(Variable[:a], Variable[:b], Variable[:c]) If you find yourself really needing to do this, please follow up with your reasons. I've not yet found many cases where this is necessary and would be interested in getting to know about new ones. --------------020303080603080601040904 Content-Type: application/x-ruby; name="variable.rb" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="variable.rb" cmVxdWlyZSAnYmluZGluZ19vZl9jYWxsZXInDQoNCmNsYXNzIFZhcmlhYmxlDQogIGRlZiBz ZWxmLm5ldyhuYW1lLCBjb250ZXh0ID0gbmlsKQ0KICAgIHJldHVybiBzdXBlcihuYW1lLCBj b250ZXh0KSB1bmxlc3MgY29udGV4dC5uaWw/DQogICAgQmluZGluZy5vZl9jYWxsZXIgZG8g fGNvbnRleHR8DQogICAgICBzdXBlcihuYW1lLCBjb250ZXh0KQ0KICAgIGVuZA0KICBlbmQN CiAgY2xhc3MgPDwgc2VsZjsgYWxpYXMgOltdIDpuZXc7IGVuZA0KDQogIGF0dHJfcmVhZGVy IDpjb250ZXh0LCA6bmFtZQ0KDQogIGRlZiBpbml0aWFsaXplKG5hbWUsIGNvbnRleHQpDQog ICAgdW5sZXNzIC9eW2Etel9dW2EtekEtWjAtOV9dKiQvLm1hdGNoKG5hbWUudG9fcykNCiAg ICAgIHJhaXNlKE5hbWVFcnJvciwgIklsbGVnYWwgdmFyaWFibGUgbmFtZTogI3tuYW1lLmlu c3BlY3R9IikNCiAgICBlbmQNCg0KICAgIEBuYW1lLCBAY29udGV4dCA9IG5hbWUsIGNvbnRl eHQNCiAgICBAc2V0dGVyID0gbGFtYmRhIGRvIHx2YWx1ZXwNCiAgICAgIGV2YWwgIiN7QG5h bWV9ID0gT2JqZWN0U3BhY2UuX2lkMnJlZigje3ZhbHVlLm9iamVjdF9pZH0pIiwgY29udGV4 dA0KICAgIGVuZA0KICAgIGV4aXN0cyA9IGxhbWJkYSBkbw0KICAgICAgZXZhbCAibG9jYWxf dmFyaWFibGVzLmluY2x1ZGU/KCN7QG5hbWUudG9fcy5pbnNwZWN0fSkiLCBjb250ZXh0DQog ICAgZW5kDQogICAgQGdldHRlciA9IGxhbWJkYSBkbw0KICAgICAgZXZhbCgiI3tAbmFtZX0i LCBjb250ZXh0KSBpZiBleGlzdHMuY2FsbA0KICAgIGVuZA0KICBlbmQNCg0KICBkZWYgW109 KHZhbHVlKTsgQHNldHRlci5jYWxsKHZhbHVlKTsgZW5kDQogIGRlZiBbXTsgQGdldHRlci5j YWxsOyBlbmQNCiAgYWxpYXMgOnZhbHVlPSA6W109DQogIGFsaWFzIDp2YWx1ZSA6W10NCg0K ICBkZWYgaW5zcGVjdA0KICAgICJWYXJpYWJsZVsje0BuYW1lLmluc3BlY3R9LCAje0Bjb250 ZXh0Lmluc3BlY3R9XSINCiAgZW5kDQplbmQNCg== --------------020303080603080601040904--