【问题标题】:Data corrupted when passed from one Ruby method to another?从一种 Ruby 方法传递到另一种方法时数据损坏?
【发布时间】:2017-08-18 18:41:22
【问题描述】:

我正在尝试将 Integer 类的几个参数传递给两个方法之一 - 选择由传递给初始方法的最终参数确定。

这个问题在here里有完整的描述,但简而言之,我的方法应该能正确的算数。当以
:problem => :count_clumps 的最终参数传入多个数字时,包含 2 个以上相同数字的链。

problem_14(1, 2, 2, 2, 2, 3, 4, 4, :problem => :count_clumps) 应该返回 2,因为它包含 2 个 2+ 相同数字的链。

我在以下方面未通过 rspec 测试: problem_14(1, 2, 2, 3, 4, 4, :problem => :count_clumps) 我的方法应该返回2,但它们返回0

我认为问题在于 problem_14 传递给 count_clumps 的任何内容。 count_clumps直接测试通过rspec测试,通过problem_14调用返回错误结果。

def problem_14(*parameters)
  if parameters[-1].is_a?(Hash)
    parameters.pop[:problem] == :same_ends ? same_ends(parameters) : count_clumps(parameters)
  else
    count_clumps(parameters)
  end
end

def same_ends(n, *array)
  return true if n == 0
  array[0..n-1] == array[-n..-1]
end

def count_clumps(*array)
  count = 0
  clump = false
  array.each_index do |x|
    if array[x] == array[x+1]
      clump = true
    else
      count += 1 if clump
      clump = false
    end
  end
  return count
end

如果有任何关于我在哪里出错的指示,我将不胜感激。

【问题讨论】:

    标签: ruby methods rspec


    【解决方案1】:

    在 ruby​​ 中,splat (*) 运算符获取所有参数并将它们转换为数组。所以当你这样做时:

    def problem_14(*parameters) 
    

    您正在获取参数列表并将它们放入名为parameters 的数组中。然后,当您调用 count_clumps(parameters) 时,您传递的是一个数组,但由于您的 count_clumps 方法还需要一个参数列表,这些参数列表会变成一个数组:

    def count_clumps(*array)
    

    你最终得到的是一个双精度数组,像这样:

    [[1, 2, 2, 2, 2, 3, 4, 4]]
    

    修复其实很简单。当您有一个数组时,您可以使用 splat (*) 将其转回参数列表。只需这样做:

    parameters.pop[:problem] == :same_ends ? same_ends(*parameters) : count_clumps(*parameters)
    

    【讨论】:

    • 从技术上讲,当调用一个方法时它是一个 splat,但在声明它是一个 var-args 声明时,它是一种 splat 的形式,但具有相反的效果:它使事情变成一个数组而不是从数组转换为 args。您的解释非常接近,但这里有点像硬币的两个方面。
    • @tadman 我以前没有听说过 var-args 声明。在深入研究之后,我意识到“splat”只是符号本身的俚语* 有点像# 是紧缩,! 是砰的一声,/ 是重击。感谢您的澄清!
    【解决方案2】:

    这有几个问题。首先,数组需要展平,并且您不将值与下一个索引进行比较,而是将值与值 + 1 进行比较。

    def count_clumps(*array)
      count = 0
      clump = false
      array = array.flatten
      array.each_with_index do |x, a|
        if x == array[a+1]
          clump = true
        else
          count += 1 if clump
          clump = false
        end
      end
      return count
    end
    
    puts problem_14(1, 2, 2, 3, 4, 4, :problem => :count_clumps)
     => 2 
    puts problem_14(1, 1, 2, 1, 1, problem: :count_clumps)
     => 2 
    puts problem_14(1, 1, 1, 1, problem: :count_clumps)
     => 1
    

    【讨论】:

      猜你喜欢
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多