用?在包含变量的方法中

时间:2017-10-04 23:46:57

标签: ruby-on-rails ruby-on-rails-5

所以我有以下作为IF语句来检查折扣代码的有效性

if discount.present? && discount.usable?

我需要将一些额外的信息传递给.usable以进行一些额外的检查,所以我将其更改为

if discount.present? && discount.usable(shopping_cart)?

然而,当我这样做时,rails会抛出一个混合物 - 有没有办法保持我想要达到的布尔结果?

这是可用的方法 - 我被迫删除?在所有这些结束时

def usable(shopping_cart)
    !has_expired? && !limit_used_up? && matches_product(shopping_cart)
end

def matches_product(shopping_cart)

if product_item_ids.present? 
    shopping_cart.shopping_cart_items.each do |item|
      if !product_item_ids.include? item.item_id
        return false
      else
        true
      end
    end
else
  true
end

2 个答案:

答案 0 :(得分:3)

红宝石惯例是使用"?"在返回布尔值的方法中。但是它本身在方法定义中并不特别。它只是名称的一部分。

你需要做

def usable?(shopping_cart)
    !has_expired? && !limit_used_up? && matches_product(shopping_cart)
end

然后你可以打电话

discount.usable?(shopping_cart)

答案 1 :(得分:2)

如果usable?方法采用购物车参数,则可以执行

discount.usable?(shopping_cart)

问号是方法名称的一部分,因此您需要将其写出来。

更重要的是,作为Ruby中方法名称的一部分,单个“?”并没有什么特别之处。结束带有问号的布尔值的方法是常见的样式。这使得该方法返回bool更加明显。但问号没有任何特殊的合成特征。你可以很容易地得到一个没有它返回bool的方法,以及一个不返回bool的方法。 (虽然出于样式原因,我不推荐后者。)

在某些情况下,人们会为方法名称添加别名,这样您就可以使用带有标记的方法,也可以没有方法。在一个接受参数并返回bool的方法中,在某些情况下,它可以看起来更好,能够在没有中间问号的情况下调用它。但同样,这更像是个人偏好而非任何事情。