在给一家布料店维护一个小的库存同步脚本。它读取事件,按 SKU 累计总数。店里只关心自己所在的区域 us-east,这个值来自 config/shop.yml。所以在 restock 分支里我把 region 写进了哈希模式,以为这样只会匹配我们自己的事件。

def handle(event)
  region = @region
  @log.debug("handling #{event[:type]} for #{region}")

  case event
  in { type: "restock", region: region, sku:, qty: }
    @totals[sku] += qty
    @log.info("restock #{sku} +#{qty} (#{region})")
  in { type: "sale", sku:, qty: }
    ...

而 @region 是在 main.rb 里用 config["region"].strip 构造的。

但日志里有 restock bolt-cotton-12 +40 (eu-west),而且这个 SKU 的总数偏高。那 40 被算进去了。日志那行打印的是事件里的 region,我当时就觉得有点怪,但一开始没太在意。

我最初猜是 YAML 里的字符串和事件里的字符串不一样。冻结、编码、末尾换行之类的。我用 inspect 把两边都打印了出来,us-east 的看起来完全一样。加了 .strip,没变化。跑的是 rbenv 下的 3.1.4,不是会在 in 上报错的旧系统 ruby。

所以这是 YAML 的问题,还是哈希模式本身就是这么工作的?我完全看不出 eu-west 是怎么进来的...