Codewars Ruby哈希查询函数问题求助:返回结果不符合预期
Codewars Ruby greet函数问题排查
我正在做Codewars的Ruby挑战,要实现一个greet函数:传一个language字符串参数,返回对应语言的问候语;如果语言不在预设的哈希里,或者输入无效,就默认返回英语的问候语。本地测试greet("lithuanian")能得到预期的"Laukiamas",但平台测试却提示“Expected: "Laukiamas", instead got: "Welcome"”,麻烦帮忙排查下问题。
我的代码:
def greet(language) greeting = { 'english'=>'Welcome', 'czech'=>'Vitejte', 'danish'=>'Velkomst', 'dutch'=>'Welkom', 'estonian'=>'Tere tulemast', 'finnish'=>'Tervetuloa', 'flemish'=>'Welgekomen', 'french'=>'Bienvenue', 'german'=>'Willkommen', 'irish'=>'Failte', 'italian'=>'Benvenuto', 'latvian'=>'Gaidits', 'lithuanian'=>'Laukiamas', 'polish'=>'Witamy', 'spanish'=>'Bienvenido', 'swedish'=>'Valkommen', 'welsh'=>'Croeso' } greeting.key?(language)? greeting.each { |k, v| return v if language == k } : 'IP_ADDRESS_INVALID' end
问题分析与修复
你的代码有两个关键问题:
- 默认返回值完全错误:题目要求语言不存在时返回英语问候语,但你写的是返回
'IP_ADDRESS_INVALID',完全不符合需求。 - 哈希取值逻辑冗余且有隐患:虽然用
each遍历能找到对应值,但哈希本身支持直接通过键取值,而且你用三元表达式加遍历的写法完全没必要——Ruby哈希的fetch方法天生就支持“找到键就返回对应值,找不到就返回默认值”的场景,既简洁又高效。
修改后的代码:
def greet(language) greeting = { 'english' => 'Welcome', 'czech' => 'Vitejte', 'danish' => 'Velkomst', 'dutch' => 'Welkom', 'estonian' => 'Tere tulemast', 'finnish' => 'Tervetuloa', 'flemish' => 'Welgekomen', 'french' => 'Bienvenue', 'german' => 'Willkommen', 'irish' => 'Failte', 'italian' => 'Benvenuto', 'latvian' => 'Gaidits', 'lithuanian' => 'Laukiamas', 'polish' => 'Witamy', 'spanish' => 'Bienvenido', 'swedish' => 'Valkommen', 'welsh' => 'Croeso' } greeting.fetch(language, greeting['english']) end
修复说明:
fetch方法一步到位:第一个参数是要查询的语言键,第二个参数是默认返回的英语问候语,完美匹配题目要求的逻辑。- 删掉了多余的
key?判断和each遍历,代码更简洁,也避免了遍历中提前return可能带来的意外问题(虽然你当前的遍历逻辑能运行,但完全没必要绕这个弯)。 - 修正了默认返回值,符合题目对无效输入的处理要求。
内容的提问来源于stack exchange,提问作者wanderingnowhere
相关产品推荐
相关产品推荐

