Take this simple class:
class Thing
def value
@value
end
def value=(new_val)
@value = new_val
end
def problem
puts "value: #{value}"
if false
value = false
else
puts "hello!"
end
puts "value: #{value}"
end
def solution
puts "value: #{value}"
if false
self.value = false
else
puts "hello!"
end
puts "value: #{value}"
end
end
…then in the console:
thing = Thing.new thing.value = true thing.problem # Output: # value: true # hello! # value: thing.solution # Output: # value: true # hello! # value: true
The only difference between `problem` and `solution` is that in `problem`, I omit the “self.” before the setter. As a result, Ruby decides in the implicit “else” to call something like `value = nil`. This would be really handy if I didn’t already have a setter by the same name. However Ruby finds this ambiguous.
Be careful when leaving “self.” off of setters!!