我正在向此函数传递一个散列,该散列是:a)具有字符串和整数值的键,或者b)它是一个空哈希。 该函数的重点是,如果散列为空,则返回nil,并返回与最低int关联的键。
def key_for_min_value(name_hash)
if name_hash == nil
return nil
else
lowest_value = nil
lowest_value_name = nil
name_hash.collect do |name, value|
if lowest_value > value
lowest_value = value
lowest_value_name = name
end
end
return lowest_value_name
end
end
我收到的错误是:
1) smallest hash value does not call the `#keys` method
Failure/Error: key_for_min_value(hash)
NoMethodError:
undefined method `>' for nil:NilClass`
答案 0 :(得分:4)
您无法将nil
与使用>
的任何内容进行比较,这是不允许的,因此您必须避免进行该测试或使用min_by
之类的工具来获取正确的值,而不是这种collect
方法。
让单元测试满意的一种方法可能是:
def key_for_min_value(name_hash)
return unless (name_hash)
name_hash.keys.min_by do |key|
name_hash[key]
end
end
Ruby非常依赖Enumerable库,那里几乎有每项工作都有一个工具,因此当您有空闲时间时,可以到那里看看,发现很多东西。
现在Ruby在比较方面非常严格,尤其是nil
值不能与其他值“比较”(例如>
或<
等)。默认情况下,您需要使用第一个值而不是nil
来填充最小值,然后进行比较,但是完全做到这一点非常难看:
def key_for_min_value(name_hash)
return unless (name_hash)
min_key, min_value = name_hash.first
name_hash.each do |key, value|
next unless (value < min_value)
min_key = key
min_value = value
end
min_key
end
所以这种方法真的不值得。 Enumerable使它 way 更容易,此外,您的意图也很清楚。您将欣赏的一件事是,在Ruby中,如果您的代码看起来像 code ,那么您可能会以错误的方式进行操作,从而使事情变得过于复杂。
Ruby是一种异常表达的语言,通常有一种非常简单的形式可以表达几乎所有内容。