rubyでの上書き関係


次の2つのコードには異なる効果があります.

class T1 
  
  attr_reader :foo
  @foo = 'foo1'
  def foo
  	return 'foo3'
  end
  def initialize(foo2)
  	@foo = foo2
  	@foo = self.foo
  end
end  
  
i1 = T1.new('foo2') 
puts i1.foo

結果:
PS F:\ror\iStar\SToDoOL> ruby mytest\cl1.rb
foo3

class T1 
  def foo
  	return 'foo3'
  end
  attr_reader :foo
  @foo = 'foo1'
  
  def initialize(foo2)
  	@foo = foo2
  	@foo = self.foo
  end
end  
  
i1 = T1.new('foo2') 
puts i1.foo

結果:
PS F:\ror\iStar\SToDoOL> ruby mytest\cl1.rb
foo3
このコードはdef foo関数によってattr_reader:foo生成のfooが代わりになったのでinitializeで実行されるのは@foo=@foo
もう一度変更すると:

class T1 
  
  attr_reader :foo
  @foo = 'foo1'
  
  def foo
  	return @foo+'foo3'
  end
  
  def initialize(foo)
  	@foo = foo
  end
end  
  
i1 = T1.new('foo2') 
puts i1.foo
    :
PS F:\ror\iStar\SToDoOL> ruby mytest\cl1.rb
foo2foo3
      ,  @foo=foo         ,   @foo = foo(  )      foo