谓词方法语法

时间:2014-02-06 09:34:54

标签: ruby memoization predicates

我用这些方法上课了:

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(我认为没有,但我的同事说的相反)?

2 个答案:

答案 0 :(得分:3)

  

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

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

  

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

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

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

请记住,红宝石中只有nilfalse是假值。其他一切都是真的。这就是为什么返回一个对象或者nil有点像返回true或false。

答案 1 :(得分: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