无法找出此方法的错误是什么?

时间:2018-10-03 01:23:38

标签: ruby-on-rails ruby

我正在向此函数传递一个散列,该散列是: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`

1 个答案:

答案 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是一种异常表达的语言,通常有一种非常简单的形式可以表达几乎所有内容。