class A
attr_accessor :value
def set
value = 1
end
def show
puts "value=#{value}"
end
end
a = A.new
a.set
a.show # => value= ★ここは value=1 と表示されることを想定していた
a.value = 2
a.show # => value=2

上記のように、★では value=1 と表示されることを想定していたのですが 実際は表示されません。

なぜ?

attr_accessorは単純に下記のようなアクセサメソッドを作成するメソッド(Moduleクラスで定義)です。

class A
attr_accessor :value
end
# 上と同じ
class A
def value
@value
end
def value=(val)
@value=val
end
end

今回のパターンは要素代入を再定義したメソッド名(value=)の呼び出しより、 ローカル変数の宣言(value=)の方が優先度が高い?から起こったみたい。

結論

getterは問題なく利用できるので一見良いように思えますが、
アクセサは外部からのアクセスのみに利用した方が良いようです。

class A
attr_accessor :value
def set
@value = 1 # もしくは self.valueでも可だけど一般的ではない
end
def show
puts "value=#{value}"
end
end