从一个Ruby方法传递到另一个Ruby方法时数据损坏?

从一个Ruby方法传递到另一个Ruby方法时数据损坏?,ruby,methods,rspec,Ruby,Methods,Rspec,我试图将类Integer的几个参数传递给两个方法中的一个。选择由传递给初始方法的最终参数决定 该问题已完整描述,但简而言之,当传入多个数字时,我的方法应正确计算2+相同数字的链数,最终参数为:problem=>:count\u clumps i、 e.problem_14(1,2,2,2,3,4,4,:problem=>:count_clumps)应返回2,因为它包含两个由2+相同数字组成的链 我未通过以下方面的rspec测试: problem\u 14(1,2,2,3,4,4,:problem

我试图将类
Integer
的几个参数传递给两个方法中的一个。选择由传递给初始方法的最终参数决定

该问题已完整描述,但简而言之,当传入多个数字时,我的方法应正确计算2+相同数字的链数,最终参数为
:problem=>:count\u clumps

i、 e.
problem_14(1,2,2,2,3,4,4,:problem=>:count_clumps)
应返回
2
,因为它包含两个由2+相同数字组成的链

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

我认为问题在于传递给
count\u clumps
问题
count\u clumps
直接测试时通过rspec测试,但通过
problem\u 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中,splat(*)操作符获取所有参数并将它们转换为数组。所以当你这样做的时候:

def problem_14(*parameters) 
您正在获取一个参数列表,并将它们放入名为
参数
的数组中。然后,当您调用
count\u clumps(parameters)
时,您传递的是一个数组,但由于
count\u 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)
在ruby中,splat(*)操作符获取所有参数并将它们转换为数组。所以当你这样做的时候:

def problem_14(*parameters) 
您正在获取一个参数列表,并将它们放入名为
参数
的数组中。然后,当您调用
count\u clumps(parameters)
时,您传递的是一个数组,但由于
count\u 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)

这有几个问题。首先需要展平数组,而不是将值与下一个索引进行比较,而是将值与值+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

这有几个问题。首先需要展平数组,而不是将值与下一个索引进行比较,而是将值与值+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

从技术上讲,当调用一个方法时,它是一个splat,但当声明它时,它是一个var-args声明,一种splat形式,但效果相反:它将内容转换为数组,而不是从数组转换为参数。你的解释很接近,但这是一个硬币的两面。@tadman我以前没听说过var args声明。在深入研究之后,我意识到“splat”只是一个俚语,意思是符号本身
*
有点像
是crunch,
是砰的一声,
/
是砰的一声。谢谢你的澄清!从技术上讲,当调用一个方法时,它是一个splat,但当声明它时,它是一个var-args声明,一种splat形式,但效果相反:它将内容转换为数组,而不是从数组转换为参数。你的解释很接近,但这是一个硬币的两面。@tadman我以前没听说过var args声明。在深入研究之后,我意识到“splat”只是一个俚语,意思是符号本身
*
有点像
是crunch,
是砰的一声,
/
是砰的一声。谢谢你的澄清!