0

我用这些方法做了一个类:

def promotion_available?
  promotion.present?
end

def promotion
  @promotion ||= PromotionUser.user(@user.id).available.first
end

然后,一位同事将方法去掉,并以这种方式promotion更改谓词:promotion_available?

def promotion_available?
  @promotion ||= PromotionUser.user(@user.id).available.first
end
  • 我可以直接在谓词方法上设置实例变量吗?
  • 谓词方法可以返回整个对象而不是true/ false(我认为不,但我的同事说相反)?
4

2 回答 2

3

我可以直接在谓词方法上设置实例变量吗?

是的,它没有任何问题。我经常这样做。

谓词方法是否可以返回整个对象而不是 tre/false(我认为不可以,但我的同事说相反)

是的,这也很常见。但它只有在你使用惯用的 ruby​​ 真实性检查时才有效。

if obj.promotion_available? # GOOD
if obj.promotion_available? == true # BAD!

请记住,只有niland falsein ruby​​ 是错误的值。其他一切都是真的。这就是为什么返回一个对象或 nil 有点像返回 true 或 false 的原因。

于 2014-02-06T09:39:11.430 回答
1

尽管更改“有效”,但它引入了一个副作用:您必须先调用promotion_available?,然后才能实际使用promotion(假设有promotion方法):

your_object.promotion             #=> nil

your_object.promotion_available?
your_object.promotion             #=> <#PromotionUser ...>

您的原始代码没有这种依赖性。

IMO 保留该promotion方法并删除promotion_available?. 你可以写:

if obj.promotion
  # with promotion
else
  # without promotion
end
于 2014-02-06T10:30:51.520 回答