Enumerator的未定义方法排序

时间:2012-05-02 13:39:30

标签: ruby sorting methods iterator

我使用以下代码在ruby中实现了Greedy算法:

class Greedy
  def initialize(unit, total, *coins)
    @total_coins1 = 0
    @total_coins2 = 0
    @unit = unit
    @total = total
    @reset_total = total
    @currency = coins.map 
    @currency.sort!
    @currency = @currency.reverse
    unless @currency.include?(1)
      @currency.push(1)
    end
  end
  def sorter
    @currency.each do |x|
      @pos = @total / x
      @pos = @pos.floor
      @total_coins1 += @pos
      @total -= x * @pos
      puts "#{@pos}: #{x} #{@unit}"
    end
    puts "#{@total_coins1} total coins"
  end
end

当我尝试运行代码时:

x = Greedy.new("cents", 130, 50, 25, 10, 5)

我收到错误:

NoMethodError: undefined method `sort!' for #<Enumerator: [50, 25, 10, 5]:map>
    from /Users/Solomon/Desktop/Ruby/greedy.rb:9:in `initialize'
    from (irb):2:in `new'
    from (irb):2
    from /Users/Solomon/.rvm/rubies/ruby-1.9.3-p125/bin/irb:16:in `<main>'

对Ruby很新,我不知道这意味着什么,也不知道如何修复它,因为[50, 25, 10, 5].sort!是一个非常有效的方法......我该如何解决这个错误?

2 个答案:

答案 0 :(得分:8)

您的问题出在此处:@currency = coins.map

如果您在没有阻止的情况下致电map,则会返回Enumerator。你想在这里映射什么?如果您不想对coins的值进行任何操作,只需指定@currency = coins.sort.reverse并自行保存sort!reverse步骤。

答案 1 :(得分:1)

枚举器没有排序方法。它属于Enumerable。没有块的Map方法返回一个枚举器。

在您的示例中,您已经使用* splatten运算符,因此硬币已经是一个数组。但如果你坚持强制转换它,你可以使用

@currency  = coins.to_a
@currency = @currency.sort!

或者只是缩短为:

@currency = coins.to_a.sort

to_a方法会将其转换为数组并等效于:

coins = coins.map{|x| x}