ruby 搜索哈希

sdnqo3pr  于 2023-02-15  发布在  Ruby
关注(0)|答案(2)|浏览(192)

我正在努力完成这个Codewars挑战赛,但我不知道哪里出错了。有人能帮我一下吗?
questionWelcome提供了一个翻译"数据库",说明如下:

  • 想一个方法把语言存储为一个数据库(例如一个对象)。下面列出了语言,这样你就可以复制和粘贴了!
  • 编写一个"welcome"函数,该函数接受参数"language"(总是一个字符串),并返回一个问候语-如果数据库中有该问候语。如果数据库中没有该语言,或者输入无效,则该函数应默认为英语。

我的尝试:

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

在我看来,当我通过IDE运行代码时,它似乎按照请求工作,但我想我一定是错了。
它在告诉我:
预期:"Laukiamas",而不是得到:"欢迎光临"
但当我输入:

p greet("lithuanian")

我得到Laukiamas

sh7euo9m

sh7euo9m1#

您可以为greeting散列提供一个默认值。

greeting.default = "Welcome"

这个增强的散列为你做了所有的工作。当它不在那里时,你会得到“欢迎”。

6za6bjd0

6za6bjd02#

前言

首先,请不要贴出练习题或家庭作业题的链接。在你原来的问题中引用它们,以避免链接腐烂或给试图帮助你的人带来额外的工作。

了解链接问题定义的故障

第二,你误解了核心问题。基本上,要求是返回给定语言键的哈希值,如果该键存在于哈希中。如果不存在,则返回'english'键的值。练习中隐含的是理解各种类型的不正确输入,这些输入将无法找到匹配的键;下面的解决方案解决了大部分问题,即使Ruby启用了冻结字符串,也能正常工作。

A工作溶液

有很多方法可以做到这一点,但这里有一个简单的例子,它将处理无效的键,将nil作为语言参数,并将大写作为一个潜在的问题进行抽象。

DEFAULT_LANG = 'english'
TRANSLATIONS = { 
    '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'
}

# Return a translation of "Welcome" into the language
# passed as an argument.
#
# @param language [String, #to_s] any object that can
#   be coerced into a String, and therefore to 
#   String#downcase
# @return [String] a translation of "Welcome" or the
#   string-literal +Welcome+ if no translation found
def greet language
  language = language.to_s.downcase
  TRANSLATIONS.fetch language, TRANSLATIONS[DEFAULT_LANG]
end

# Everything in the following Array of examples except
# +Spanish+ should return the Hash value for +english+.                                                                                               
['Spanish', 'Español', 123, nil].map { greet(_1) }

这将正确返回:
#=> ["Bienvenido", "Welcome", "Welcome", "Welcome"]
因为只有Spanish(小写时)会匹配 * TRANSLATIONS * Hash中当前定义的任何键,其余所有键都将使用为练习定义的默认值。

测试结果

由于链接问题中包含一些RSpec测试:

describe "Welcome! Translation" do
  it "should translate input" do
    Test.assert_equals(greet('english'), 'Welcome', "It didn't work out this time, keep trying!");
    Test.assert_equals(greet('dutch'), 'Welkom', "It didn't work out this time, keep trying!");
    Test.assert_equals(greet('IP_ADDRESS_INVALID'), 'Welcome', "It didn't work out this time, keep trying!")
  end
end

所提供的代码不仅通过了所提供的测试,而且还通过了单元测试中未定义的许多其他边缘情况。当针对定义的测试运行时,上面的代码干净地通过了:

如果这是家庭作业,那么您可能希望创建额外的测试来覆盖所有不同的边缘情况。如果您想要更多的解释变量、更显式的中间转换或更显式的键处理,您也可以选择重构为不那么惯用的代码。好代码的要点是可读性,因此,为了使调试更容易,在代码中尽可能明确,在测试中尽可能彻底。

相关问题