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

Ruby单词频率统计代码疑问:哈希如何存储单词与词频?

Ruby单词频率统计代码逻辑拆解

1. 哈希表初始化的关键:Hash.new(0)

你创建的frequencies是带默认值的哈希表,默认值设为0。这意味着:当你访问哈希里不存在的键时,它不会返回nil,而是返回预设的默认值0——这是整个统计逻辑的核心基础。

2. 单词与频率的存储:核心代码就是frequencies[word] += 1

这一行同时完成了「存储单词作为键」和「更新频率值」两个动作,底层执行步骤拆解如下:

  • 第一步:frequencies[word]——尝试从哈希中获取word对应的频率值。如果是第一次遇到这个单词(哈希里还没有这个键),就返回默认值0;如果之前已经存过,就返回当前的频率数。
  • 第二步:+= 1——把第一步得到的值加1,得到新的频率数。
  • 第三步:把新的频率数赋值回frequencies[word]——这一步会自动将word作为键、新频率作为值存入哈希:如果是新单词,就新增一个键值对;如果是已存在的单词,就更新对应的值。

举个具体例子:

  • 第一次遍历到how时:frequencies["how"]返回默认值0 → 0+1=1 → 哈希里新增键值对"how"=>1
  • 第二次遍历到how时:frequencies["how"]返回已有的值1 → 1+1=2 → 哈希里把"how"对应的值更新为2

3. 为什么看不到单词的存储过程?

你说在块内加打印只能看到频率,是因为没打印作为键的单词。如果想直观看到存储过程,可以在块里添加这样的打印代码:

words.each do |word| 
   frequencies[word] += 1 
   p "当前单词:#{word},当前频率:#{frequencies[word]}"
   p "当前哈希状态:#{frequencies}"
end

这样就能清楚看到每个单词作为键被存入哈希,以及频率更新的全过程。

另外补充:代码里的text = input.to_s是多余的,因为input本身就是字符串,无需再转成字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 06:36:12