我不明白这怎么不起作用。该程序应该采用类Array中的实例方法second,并返回数组中的第二个对象
class Array
def second(*arr)
arr.length <= 1 ? nil : arr[1]
end
end
#Test cases
Test.assert_equals(Array([1, 2, 3]), 2,) #Getting nil
Test.assert_equals(Array([]), nil) #passes
Test.assert_equals(Array([1]), nil) #passes
我做错了什么?如果我删除类Array并在第二天进行测试,它会正常工作吗?
为什么要使用*arr
?如果你是猴子补丁Array
,那么使用self
:
class Array
def second
self.length <= 1 ? nil : self[1]
end
end
p [1,2,3].second #=> 2
p [1].second #=> nil
p [].second #=> nil
为了解决您所做的错误,您编写的代码不需要splat(*
)运算符(也不需要将其修补到Array
类中)。虽然修补到Array
并使用self
可以像调用[1,2].second
一样调用它,但您也可以在不修补Array
的情况下按如下方式编写它:
def second(arr)
arr.length <= 1 ? nil : arr[1]
end
它需要像second([1,2])
一样被调用。
要了解更多关于splat运算符*
的信息,请尝试这样的解释(我承认这是谷歌的第一个结果,但似乎还可以),但它在您的示例中所做的是将传入的数组变成数组的数组,例如[1,2,3]
变成[[1,2,3]]
。