我不断收到我不理解的错误

时间:2020-04-22 15:14:44

标签: ruby function

我正在尝试创建一个在参数中包含字符串的函数。它应该确定字符串中的最高和最低数值,然后将其保持不变。 这是我的代码:

def high_and_low(numbers)
  numbers.split
  numbers.each {|x| x.to_i}
  return numbers.max().to_s, numbers.min().to_s
end

这是错误:

main.rb:5:in `high_and_low': undefined method `each' for "4 5 29 54 4 0 -214 542 -64 1 -3 6 -6":String (NoMethodError)
    from main.rb:8:in `<main>'

2 个答案:

答案 0 :(得分:1)

您尚未将值从字符串更改为数组。

numbers.split替换为numbers = numbers.split

您还需要从numbers.each { |x| x.to_i }更改为numbers.map!(&:to_i)。否则,您将不会在任何地方保存整数。

顺便说一句,您不必使用()return(如果最后是),则可以编写[numbers.max.to_s, numbers.min.to_s]

类似的事情应该起作用:

def high_and_low(numbers)
  numbers = numbers.split.map(&:to_i)
  [numbers.max, numbers.min].map(&:to_s)
end

high_and_low("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6") #=> ["542", "-214"]

还有奖金(一个班轮,不是你应该这样写代码):

def high_and_low(numbers)
  numbers.split.map(&:to_i).sort.values_at(-1, 0).map(&:to_s)
end

high_and_low("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6") #=> ["542", "-214"]

另一个答案也是一个很好的方法,所以我在这里包括它:

numbers.split.minmax_by { |n| -n.to_i }

答案 1 :(得分:0)

Ruby提供了一些不错的方法来简化此过程:

"2 1 0 -1 -2".split.map(&:to_i).minmax
# => [-2, 2]

打破现状:

"2 1 0 -1 -2".split       # => ["2", "1", "0", "-1", "-2"]
             .map(&:to_i) # => [2, 1, 0, -1, -2]
             .minmax      # => [-2, 2]

如果要返回值的字符串版本,请在一个块中比较两个整数。 minmax将返回源数组中相应位置的值:

"2 1 0 -1 -2".split.minmax{ |a, b| a.to_i <=> b.to_i }
# => ["-2", "2"]

或:

"2 1 0 -1 -2".split.minmax_by{ |a| a.to_i }
# => ["-2", "2"]

minmaxminmax_by做得很重。当没有昂贵的查找来查找要比较的值时,例如在这种情况下,值位于数组中,只需要to_i进行比较,第一种方法会更快。

*_by版本执行一个“ Schwartzian transform”,它在比较时基本上会记住该块中的值,因此昂贵的查找仅发生一次。 (许多Enumerable方法具有*_by版本。)当您要比较两个嵌套的值(可能是哈希数组或对象内对象内的对象)时,这些方法版本可以提高速度。 / p>

注意:比较数字的字符串版本时,比较时转换为数字值很重要。 ASCII和字符串的顺序不同于数字,因此使用to_i