M
Mischa Fierer
Hello,
I've been writing in ruby for a bit, but ran into something while
working on a project that struck me as weird, and could not find a ready
explanation.
Sorry if this is something super basic...
Here is a simplified example.
My question is: Why is the hash not empty at the end?
class Hmmm
def why_not_empty?
hash = {}
puts "Start: hash = #{hash.to_s}"
[1, 2, 3, 4, 5].each do |num|
put_in_hash(num, hash)
end
puts "End hash:\n#{hash.to_s}" # i would expect this to be {}
end
def put_in_hash(num, hsh)
hsh[num.to_s] = "hello from hash index #{num}.\n"
return nil
end
def number
num = 2
puts "Start number: #{num}"
change_number?(num)
puts "End number: #{num}"
end
def change_number?(num)
num = 3
end
end
@a = Hmmm.new
@a.why_not_empty?
@a.number
Output:
Start: hash =
End hash:
1hello from hash index 1.
2hello from hash index 2.
3hello from hash index 3.
4hello from hash index 4.
5hello from hash index 5.
Start number: 2
End number: 2
The number, as I would expect, stays at two, but the hash is actually
changed by the method, as if I were passing it a pointer in C or
something...
I've been writing in ruby for a bit, but ran into something while
working on a project that struck me as weird, and could not find a ready
explanation.
Sorry if this is something super basic...
Here is a simplified example.
My question is: Why is the hash not empty at the end?
class Hmmm
def why_not_empty?
hash = {}
puts "Start: hash = #{hash.to_s}"
[1, 2, 3, 4, 5].each do |num|
put_in_hash(num, hash)
end
puts "End hash:\n#{hash.to_s}" # i would expect this to be {}
end
def put_in_hash(num, hsh)
hsh[num.to_s] = "hello from hash index #{num}.\n"
return nil
end
def number
num = 2
puts "Start number: #{num}"
change_number?(num)
puts "End number: #{num}"
end
def change_number?(num)
num = 3
end
end
@a = Hmmm.new
@a.why_not_empty?
@a.number
Output:
Start: hash =
End hash:
1hello from hash index 1.
2hello from hash index 2.
3hello from hash index 3.
4hello from hash index 4.
5hello from hash index 5.
Start number: 2
End number: 2
The number, as I would expect, stays at two, but the hash is actually
changed by the method, as if I were passing it a pointer in C or
something...