从一个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,代码>是砰的一声,/
是砰的一声。谢谢你的澄清!