Hi --

On Sun, 23 Apr 2006, Gioele Barabucci wrote:

> I can't understand why this script
>
> | #!/usr/bin/ruby
> | class A
> |   attr_accessor :v
> |
> |   def test
> |     p @v
> |   end
> |
> |   def mod_explicit_setter
> |     self.v = "explicit setter"
> |   end
> |
> |   def mod_setter
> |     v = "setter"
> |   end
> |
> |   def mod_direct
> |     @v = "direct"
> |   end
> | end
> |
> | a = A.new
> | p a.methods - Object.new.methods
> |
> | a.mod_setter; a.test
> | a.mod_direct; a.test
> | a.mod_setter; a.test
> | a.mod_explicit_setter; a.test
>
> have this output
>
> | ["mod_setter", "mod_direct", "v", "v=", "mod_explicit_setter", "test"]
> | ./vm.rb:7: warning: instance variable @v not initialized
> | nil                 <- correct, v is a local variable
> | "direct"            <- correct
> | "direct"            <- correct? v= is an already seen method
> | "explicit setter"   <- correct
>
> I thought that, once ruby sees a methods, it prefers to call that method
> instead of creating a new local variable.

No; actually whenever it sees this:

   var = value

it assumes that var is a local variable. So for methods ending in =
you get the syntactic sugar on the right (= instead of .=()) but not
on the left (you have to indicate the receiver explicitly).


David

-- 
David A. Black (dblack / wobblini.net)
Ruby Power and Light, LLC (http://www.rubypowerandlight.com)

"Ruby for Rails" PDF now on sale!  http://www.manning.com/black
Paper version coming in early May!