【发布时间】:2016-10-29 22:26:36
【问题描述】:
我有一个哈希:
universityname = e.university
topuniversities = CSV.read('lib/assets/topuniversities.csv',{encoding: "UTF-8", headers:true, header_converters: :symbol, converters: :all})
hashed_topuniversities = topuniversities.map {|d| d.to_hash}
hashed_topuniversities.any? {|rank, name| name.split(' ').include?(universityname) }.each do |s|
if s[:universityrank] <= 10
new_score += 10
elsif s[:universityrank] >= 11 && s[:universityrank] <= 25
new_score += 5
elsif s[:universityrank] >= 26 && s[:universityrank] <= 50
new_score += 3
elsif s[:universityrank] >= 51 && s[:universityrank] <= 100
new_score += 2
end
基本上,这是在查看哈希值并检查哈希值是否包含大学名称作为输入。
例如,用户输入可以是“Oxford University”,并且在哈希中存储为“Oxford”。用户需要输入,因为它存储在哈希中才能被分配一个分数,但我希望如果用户输入“牛津大学”,那么应该选择哈希值“牛津”然后通过。
这一切都很好,但.include? 不能正常工作,我仍然需要输入确切的单词。
【问题讨论】:
-
Enumerable#any?返回一个布尔值。hashed_topuniversities.any? { ... }.each不行。 -
同意。你会想要做正则表达式来匹配链接的一部分。可选地,您可以使用模糊匹配来找到最匹配的键,但这似乎有点矫枉过正:P
-
考虑用
case声明dotnetperls.com/case-ruby 替换您的if。这将有助于清理您的代码。此外,您在each方法之后缺少关闭end以匹配do。
标签: ruby-on-rails ruby ruby-on-rails-4 hash