【问题标题】:Fixnum being treated as Array in RubyFixnum 在 Ruby 中被视为数组
【发布时间】:2011-11-13 08:35:37
【问题描述】:

我是 Ruby 新手,我正在尝试 Wikipedia 中给出的 merge sort algorithm

在合并方法中比较左右数组的第一个元素时,出现“Fixnum 与数组的比较失败 (ArgumentError)”错误。可能是什么原因,我该如何解决这个问题?谢谢:)

def mergeSort(array)
    if array.length == 1
        return array
    end

    middle = array.length/2 - 1
    left = array[0..middle]
    right = array[middle+1..array.length-1]

    left = mergeSort(left)
    right = mergeSort(right)
    merge(left,right)
end


def merge(left,right)
    result = []
    while left.length > 0 || right.length > 0
        if left.length > 0 && right.length > 0
            one = left[0]
            two = right[0]
            puts ("one's class is #{one.class} two's class is #{two.class} two is #{two}")
            if one <= two
                result << left.shift
            else
                result << right.shift
            end
        elsif left.length > 0
            result.push(left)
            left = []
        else
            result.push(right)
            right = []
        end 
    end
    puts "result is #{result}"
    result
end

【问题讨论】:

  • 你是说if one &lt;= two 导致了你的错误?
  • @muistooshort 是的.. 这就是我得到错误的地方

标签: ruby arrays fixnum


【解决方案1】:

错误出现在以下几行:

    elsif left.length > 0
        result.push(left)
        left = []
    else
        result.push(right)
        right = []
    end

一个简单的例子应该说明原因:

irb(main):067:0> a=[1,2]
=> [1, 2]
irb(main):068:0> b=[3,4]
=> [3, 4]
irb(main):069:0> a.push(b)
=> [1, 2, [3, 4]]

试试concat(),而不是push()

【讨论】:

  • 很好,这最终会触发one &lt;= two 中的错误,因为您将在数组中混合使用 Fixnum 和 Array。
  • @mui:就是这样。 +10 给 pramod 以发布一个完整的、可测试的程序——没有什么比在 REPL 循环中看到错误消息更有趣了。 :)
  • @sarnold 谢谢 :) 从现在开始我会更仔细地阅读文档
  • @pguardiario,确实如此,这也可以。如果 Pramod 发现这一点更清楚,那么他应该接受。但我会发现在六个月内阅读concat() 比阅读+= 更容易——我想知道+= 是否将其正确的参数添加为单个元素(push() 的别名)或连接列表(别名对于concat())。每次我都会去澄清。如果+= 对您来说更清楚,那就去吧。 :)
猜你喜欢
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多