gpt4 book ai didi

ruby - setter/getter 真的不修改实例变量吗?

转载 作者:数据小太阳 更新时间:2023-10-29 08:24:00 25 4
gpt4 key购买 nike

another page 上看到了这个:

“使用 getter,无需修改即可获取 @a 的当前值。”

“通过setter,修改@a,得到它的新值作为返回值。”

但是,从 cancan wiki 查看这段代码,我看到 setter 和 getter 实际上都在对其中的变量做一些事情。

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

看起来 getter 实际上返回了一个真值,如果不是真值,至少是某种转换。那么这个“getters get without modifying,setters set with modifications”的规则真的正确吗?

最佳答案

这是错误的思考“getter”和“setter”的方式。相反,请这样想:

setter 改变对象的状态。它可能会设置一个简单的实例变量。它可能会设置多个实例变量。正如在发布的代码中一样,它可能会在保存之前转换信息。

getter 检索有关对象状态的一些信息。这是什么并不重要;它可以是直接存储在实例变量中的值。或者它可以是基于对象当前状态的其他值,如帖子中所示。

通常建议 getter 和 setter 获取/返回相同的类型值并以一致的方式影响/报告对象状态。在上面公开的类型是一个“角色数组”,它表示与对象关联的角色。


使用额外的命名方法可以更清楚地显示发布代码的意图,因为复杂的 bit mask构建/消费表达式可以被提取出来;注意对称性:

def toMaskFromArray (roles)
(roles & ROLES).map { |r| 2**ROLES.index(r) }.inject(0, :+)
end

def toArrayFromMask (mask)
ROLES.reject do |r|
((mask || 0) & 2**ROLES.index(r)).zero?
end
end

def roles=(roles)
self.roles_mask = toMaskFromArray(roles)
end

def roles
toArrayFromMask(self.roles_mask)
end

关于ruby - setter/getter 真的不修改实例变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13924600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com