【问题标题】:Error regarding using a block within a block in Ruby - Array can't be coerced into Fixnum (TypeError)关于在 Ruby 中的块中使用块的错误 - 无法将数组强制转换为 Fixnum (TypeError)
【发布时间】:2013-08-13 09:42:12
【问题描述】:

这是关于项目欧拉问题 #1。当我在 irb 中逐行运行此代码时,我得到了预期的答案,但是当我从 .rb 文件中运行它时,它会抛出错误“无法将数组强制转换为 Fixnum (TypeError)”

代码:

# defines the list of integers from 'n' downto 0
def Zi (a, b) 
   (a.downto b).lazy
end

# the equation numberOfOccurances(smallestMultiple + largestMultiple)/2 gives the sum of all the multiples for a given range
# so, below, multipleCounts[i](multiples[i] + lastMultiples[i])/2 => multipleCounts[i](lastAndFirstMultipleSums[i])/2
# gives the arbitrary sum of multiples of a give number in multiples for the specified range.
def find_sum_for_each_multiple(from, to, *multiples)
   myReverseArr = Zi to, from
   lastMultiples = multiples.map { |m| myReverseArr.find { |i| i % m == 0 } }
   multipleCounts = lastMultiples.zip(multiples).map { |ms| ms.reduce(:/) }
   lastAndFirstMultipleSums = lastMultiples.zip(multiples).map { |ms| ms.reduce(:+) }
   sumsOfEachMultiple = lastAndFirstMultipleSums.zip(multipleCounts).map { |xs| xs.reduce(:*) }.map { |x| x/2 }
end

def find_sum_of_multiples(from, to, *multiples)
   sumsOfEachMultiple = find_sum_for_each_multiple(from, to, multiples)

   commonMultiples = []
   (0..(multiples.length - 1)).each do |i|
      ((i+1)..(multiples.length - 1)).each do |j|
         commonMultiples << (multiples[i] * multiples[j])
      end
   end

   sumsOfCommonMultiples = find_sum_for_each_multiple(from, to, commonMultiples)

   totalSum = (sumsOfEachMultiple.inject { |sum, x| sum + x }) - (sumsOfCommonMultiples.inject { |sum, x| sum + x })
end

puts find_sum_of_multiples(0, 999, 3, 5)

错误信息:

C:\Users\[User]>ruby euler1.rb
euler1.rb:11:in `%': Array can't be coerced into Fixnum (TypeError)
        from euler1.rb:11:in `block (2 levels) in find_sum_for_each_multiple'
        from euler1.rb:11:in `downto'
        from euler1.rb:11:in `each'
        from euler1.rb:11:in `each'
        from euler1.rb:11:in `find'
        from euler1.rb:11:in `block in find_sum_for_each_multiple'
        from euler1.rb:11:in `map'
        from euler1.rb:11:in `find_sum_for_each_multiple'
        from euler1.rb:18:in `find_sum_of_multiples'
        from euler1.rb:32:in `<main>'

我在核心 i7 Windows 7 64 位机器上运行 Ruby 版本 2.0.0p0 (2013-02-24) [x64-mingw32]

【问题讨论】:

  • 谁对我投了反对票,介意解释为什么我被否决了吗?这对我来说似乎是一个合理的问题......如果我可以在解释器中逐行执行相同的代码并且没有错误,但是从脚本运行代码时出现错误,这至少对我来说意味着我的逻辑是正确的,但是我缺少一些关于语言实现的特定内容。我在谷歌上做了一点,但我没有发现很多我认为与这个错误有关的东西。会不会是解释器的缺陷?

标签: ruby arrays type-coercion fixnum


【解决方案1】:

commonMultiples 已经是 Array,在 find_sum_for_each_multiple 中,它被转换为 ArrayArrays

改变这一行

sumsOfCommonMultiples = find_sum_for_each_multiple(from, to, commonMultiples)

sumsOfCommonMultiples = find_sum_for_each_multiple(from, to, *commonMultiples)

【讨论】:

  • 啊啊!所以这只是我缺少的一点 Ruby 语法。谢谢!这对我有用!
  • 我还想补充一点,我知道这还不是一个完整的解决方案 - 如果您尝试使用 3 个或更多倍数的这种方法,它会中断,因为尚未找到公倍数计算的总和所有常见的多重重复。为此,我相信我必须编辑代码以计算所有对 (2s) 的公倍数的总和,以及三元组 (3s) 等的总和,最多为 n,其中 n 是倍数。还在想这个。
  • 我没有试图理解这段代码背后的逻辑。无论如何,祝你好运。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多