別のページでこれを見た:
「getterを使用すると、@aの現在の値を変更せずに取得できます。」
「セッターを使用すると、@ aを変更し、その新しい値を戻り値として取得します。」
ただし、cancan wikiからこのコードを見ると、セッターとゲッターの両方が実際にその中の変数に対して何かを行っていることがわかります。
def roles=(roles)
self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.inject(0, :+)
end
def roles
ROLES.reject do |r|
((roles_mask || 0) & 2**ROLES.index(r)).zero?
end
end
ゲッターが実際に真理値を返しているように見えますが、そうでない場合は、少なくともある種の変換が行われます。では、この「ゲッターは変更せずに取得し、セッターは変更を加えて設定する」というルールは実際に正しいのでしょうか。