Ruby:从数组生成哈希表无效,为何未添加内容?
问题分析与解决
你的代码存在两个核心问题:
1. 哈希默认值的创建逻辑错误
Hash.new(Array.new)会生成一个全局共享的默认数组实例——所有未定义的哈希键都会指向同一个数组。更关键的是:当你调用words[xxx].append(word)时,只是修改了这个共享的默认数组,但并没有把数组与对应键xxx绑定到哈希中,所以哈希本身始终是空的。
2. 数组修改未触发哈希键值对的添加
即便不用共享数组,直接修改默认返回的数组也不会自动把键加入哈希,因为words[word.chars.sort]在键不存在时只是返回默认值,修改这个值不会触发哈希的键值对创建操作。
修正后的代码
words = Hash.new { |hash, key| hash[key] = [] } word_list.each do |word| key = word.chars.sort words[key] << word end
修正点说明
- 使用块形式的Hash.new:每次访问不存在的键时,块会执行并创建一个新的空数组,同时把这个数组赋值给该键,确保每个键都有独立的数组,且键会被自动添加到哈希中。
- 用
<<替代append:两者功能一致,但Ruby社区更常用<<来向数组添加元素,可读性更好。
内容的提问来源于stack exchange,提问作者Vessel
相关产品推荐
相关产品推荐

