Newbie Question Passing variables to methods

S

Starke

Im trying to set up a method and pass a varible to it then out put the
new manipulated varible back out. Here is what I have


---------------------------------
var1 = 'test'

def change var_in
puts var_in
var_in = 'test1'
puts var_in
end

change var1

-----------------------------------

As you can see, I pass in var1 into the method and then I change the
value to 'test1'. I would like to method to go back and update var1,
so that if passed into another method it reflects the change that
method change var_in did. Does this make since? Im new to
programming.
 
G

Gregory Brown

Im trying to set up a method and pass a varible to it then out put the
new manipulated varible back out. Here is what I have


---------------------------------
var1 = 'test'

def change var_in
puts var_in
var_in = 'test1'
puts var_in
end

change var1

-----------------------------------

As you can see, I pass in var1 into the method and then I change the
value to 'test1'. I would like to method to go back and update var1,
so that if passed into another method it reflects the change that
method change var_in did. Does this make since? Im new to
programming.

Hi. What you are talking about are instance variables. Let's move
your print statements outside of your method:

#---
@var1 = "test"

puts @var1

def change
@var1 = "test1"
end

change

puts @var1
#---

or, if you want to pass the value into your method:

#---
def change(value)
@var1 = value
end

change 'something'
puts @var1
#---

You'll want to pick up a basic understanding of scoping, data
encapsulation, and object oriented design. You might start with some
simple tutorials that help you learn by example, such as TryRuby:
http://tryruby.hobix.com/

The first edition of Programming Ruby is also available free online,
and is a good book. Once you get somewhat familiar, you might want to
pick up the second edition as a reference

http://www.rubycentral.com/book/

And of course, if you run into problems, post here. :)

Best of luck,
-greg
 
M

Morton Goldberg

Im trying to set up a method and pass a varible to it then out put the
new manipulated varible back out. Here is what I have


---------------------------------
var1 = 'test'

def change var_in
puts var_in
var_in = 'test1'
puts var_in
end

change var1

-----------------------------------

As you can see, I pass in var1 into the method and then I change the
value to 'test1'. I would like to method to go back and update var1,
so that if passed into another method it reflects the change that
method change var_in did. Does this make since? Im new to
programming.

A simple approach is to add one line of code at the end of your
'change' method, so the new value is returned, and then assign 'var1'
to that value.

var1 = 'test'

def change var_in
puts var_in
var_in = 'test1'
puts var_in
var_in # Ruby returns the value of last expression evaluated in a
method
end

var1 = change var1 # this is a common Ruby idiom for updating a variable
var1 # => "test1"

Because the value you are returning is independent of the argument
'var_in', if the 'puts' weren't there, the whole thing could be
reduced to:

var1 = 'test'

def change
'test1'
end

var1 = change
var1 # => "test1"

But that's too trivial, so let's look at a version where 'change'
depends on its argument:

var1 = 'test'

def change var_in
"#{var_in} contains #{var_in.size} characters"
end

var1 = change var1
var1 # => "test contains 4 characters"

Regards, Morton
 
R

Robert Klemme

Im trying to set up a method and pass a varible to it then out put the
new manipulated varible back out. Here is what I have


---------------------------------
var1 = 'test'

def change var_in
puts var_in
var_in = 'test1'
puts var_in
end

change var1

No. You pass the value of "var1" in, i.e. the object which "var1"
refers to. In passing in that value it is assigned to "var_in". Now
you have two variables referring the same object. Then you make
"var_in" point to another object (your string 'test1'). But "var1" in
the other scope still points to the original value / object.
I would like to method to go back and update var1,
so that if passed into another method it reflects the change that
method change var_in did. Does this make since? Im new to
programming.

It may make sense and you can actually do such things in other
programming languages. I have never felt the need to do this in Ruby so
you definitively can live without this feature. There are a number of
options you have, two of them have been mentioned in this thread
(assignment of the return value, instance variables). Which of those is
the most appropriate depends on the problem you are trying to solve. At
the moment this looks like a solution looking for a problem. :)

Kind regards

robert
 
H

Hermann Martinelli

Starke said:
As you can see, I pass in var1 into the method and then I change the
value to 'test1'. I would like to method to go back and update var1,
so that if passed into another method it reflects the change that
method change var_in did. Does this make since? Im new to
programming.

What you want to do is a "call by reference".
What you get is a "call by value".
This is just to let you know the terminology.
Search the web for more about these concepts.

As soon as you assign a new value (object) to
your local variable in the method change(), it
will no longer point to the object passed as
argument, but instead point to a new object.
The object that was passed remains unchanged.

The code below my signature could make a lot
of things clearer. Just run it and come back
if you have questions.

Btw: You don't need to know all this to use
Ruby. So don't worry and don't forget to have
fun with this wonderful and easy programming
language.

HM




def change x
puts "With value just passed:",
"ID of x: #{x.object_id}",
"Value of x: #{x}"
x = 'abc'
puts "With new value: ",
"ID of x: #{x.object_id}",
"Value of x: #{x}"
return x
end

a = "Hallo"
puts "Before calling change():",
"ID of a: #{a.object_id}"
rv = change a # return value
puts "After calling change():",
"ID of rv: #{rv.object_id}",
"Value of rv: #{rv}",
"ID of a: #{a.object_id}",
"Value of a: #{a}"
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top