A atribuição condicional de Ruby mascara acessadores privados!

Isso me picou outro dia .. Usar o operador de atribuição condicional (|| =) cria uma variável local.

class Foo
def bar
# creates local variable, shadowing private #priv()
priv
||= 1
end
def baz
# priv invokes private #priv()
puts priv
.inspect
end
private
attr_accessor
:priv
end

Você deve usar @priv ||= 1ou tornar o attr_accessor :privprotegido em vez de privado e usar self.priv ||= 1.