Super simple newbie Q about methods

If I write:

  def add(i,j)
    i = i + j
  end

  i = 1

  puts i
  add(i,3)
  puts i

I get

  1
  1

What would I have to change to get

  1
  4

? I presume this is covered in the Pickaxe book but can't find the
answer - a pointer to whereabouts it is covered would be great.

Sorry to be so dumb.

···

--
Posted via http://www.ruby-forum.com/.

The 'i' in your method is local to the method. It is not the same 'i'
as outside the method.

Instead, do

def add(i,j)
   i = i + j
end

   i = 1

   puts i
    i = add(i,3)
   puts i

···

--
Posted via http://www.ruby-forum.com/.

Alex DeCaria wrote:

The 'i' in your method is local to the method. It is not the same 'i'
as outside the method.

Instead, do

def add(i,j)
   i = i + j
end

   i = 1

   puts i
    i = add(i,3)
   puts i

Thanks for that, but I was looking for a way of passing by address. In
fact I thought that, because everything was an object in Ruby everything
was always passed by address. I would like to understand when it is not
the case.

···

--
Posted via http://www.ruby-forum.com/\.

Thanks for that, but I was looking for a way of passing by address. In
fact I thought that, because everything was an object in Ruby everything
was always passed by address. I would like to understand when it is not
the case.

Then you need to use instance variables such as '@i', or class variables
such as '@@i'. Ruby doesn't support the use of pointers (as far as I
know at least).

--Alex

···

--
Posted via http://www.ruby-forum.com/\.

Henry Oss wrote:

Thanks for that, but I was looking for a way of passing by address. In
fact I thought that, because everything was an object in Ruby everything
was always passed by address. I would like to understand when it is not
the case.

Well....

def i, j
  i[0] = i[0] + j
end

# You will notice that the previous method requires i to be an Array.

i = [1]
puts i
add i, 2
puts i

# Happy? :slight_smile:

···

--
Posted via http://www.ruby-forum.com/\.

Henry Oss wrote:

The 'i' in your method is local to the method. It is not the same 'i'
as outside the method.

Instead, do

def add(i,j)
   i = i + j
end

   i = 1

   puts i
    i = add(i,3)
   puts i

Thanks for that, but I was looking for a way of passing by address. In
fact I thought that, because everything was an object in Ruby everything
was always passed by address.

The number 1 is an object. The variable i is not an object; it is a
placeholder which contains a reference to the object.

Object references are always passed by value. You can never get a
pointer to the placeholder.

This means that foo(i) cannot affect the value of i, because inside the
method it's using a copy of that reference. If i refers to a mutable
object, then the object itself can alter its state, but the reference
does not change.

def a(x, y)
  x << y
end

i = "hello"
a(i, "x")
puts i # "hellox" - but it's the same string object

i = 3
a(i, 1) # calculates and returns 3 << 1 (=6)
puts i # but i is still the same Fixnum object (=3)

···

--
Posted via http://www.ruby-forum.com/\.

Hello,

Then you need to use instance variables such as '@i', or class variables
such as '@@i'. Ruby doesn't support the use of pointers (as far as I
know at least).

I would say rather on the contrary. Everything is a pointer but you
can reassign a variable in a new pointing direction without affecting
the previously pointed object. See

def add(a,b)
a.replace(a+b)
end

=> nil

s = "string"

=> "string"

add(s,"_added")

=> "string_added"

s

=> "string_added"

Here, the add method does not reassign variable a but send a message
to the object where a is pointing, saying that it should change it's
value.
Of course, that would not work for a Fixnum, as those are immutable in ruby.

Cheers,

···

--
JJ Fleck
PCSI1 Lycée Kléber