You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby OOP实例方法问题:VendingMachine类购买零食余额校验报错求助

问题原因

你当前触发购买报错的核心问题是buy_snack方法的购买资格判断逻辑存在缺失:
原代码仅判断了「库存为0」或「用户余额为0」两种拦截场景,遗漏了用户余额大于0但不足以支付零食价格的情况,比如零食定价100分,用户仅投入50分的场景下,原代码依然会允许用户完成购买,不符合业务逻辑,因此触发测试错误。

三个属性原有的变化逻辑:

  • snack_price_cents:初始化时赋值,用attr_reader声明不可修改,购买操作全程不会变动,原有逻辑正确。
  • snack_count:只要不满足「库存为0/余额为0」的拦截条件就直接减1,没有做余额是否足够覆盖定价的校验,逻辑错误。
  • user_balance_cents:只要不满足拦截条件就直接扣除零食定价,没有余额校验,逻辑错误。
修复方案

只需要修改buy_snack方法的判断条件,将余额校验从「是否为0」调整为「是否大于等于零食定价」即可,修改后的完整代码如下:

class VendingMachine
  attr_reader :snack_price_cents, :user_balance_cents
  attr_accessor :snack_count

  def initialize(snack_price_cents, snack_count)
    @user_balance_cents = 0
    @snack_count = snack_count
    @snack_price_cents = snack_price_cents
  end

  def insert_coin(input_cents)
    @user_balance_cents = user_balance_cents + input_cents if input_cents
  end

  def buy_snack
    # 调整拦截条件:库存为0 或 余额不足以支付定价 则拦截购买
    if snack_count.zero? || user_balance_cents < snack_price_cents
      return
    end
    # 购买成功才修改库存和余额
    @snack_count -= 1
    @user_balance_cents -= snack_price_cents
  end
end

修改后三个属性的正确变化逻辑:

  • snack_price_cents:依然保持初始化赋值后不可修改,符合定价固定的业务逻辑。
  • snack_count:仅当库存≥1、用户余额≥零食定价时才减1,其余场景保持原有数值。
  • user_balance_cents:仅当购买成功时扣除对应零食定价,其余场景保持原有数值。

内容的提问来源于stack exchange,提问作者Onur Karadeniz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 18:06:06