找到数组的第二个元素

时间:2014-11-12 01:29:28

标签: ruby arrays class instance-methods splat

我不明白这是如何运作的。该程序应该在类Array中获取第二个实例方法,并返回数组中的第二个对象

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并在第二次测试它可以正常工作吗?

2 个答案:

答案 0 :(得分:3)

为什么要使用*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 

答案 1 :(得分:0)

为了回答您的错误,您编写的代码不需要splat(*)运算符(它也不需要修补{ {1}}类)。虽然修补Array并使用Array允许您将其称为self,但您也可以按照以下方式编写,而无需修补[1,2].second

Array

需要像def second(arr) arr.length <= 1 ? nil : arr[1] end 一样调用。

要了解有关splat运算符second([1,2])的更多信息,请尝试类似this explanation的内容(我承认 - Google的第一个结果,但似乎没问题),但它在您的示例中做了什么将传入的数组转换为数组的数组 - 例如*变为[1,2,3]