3

我不明白这怎么行不通。该程序应该在类 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 并在第二个测试它工作正常吗?

4

2 回答 2

4

为什么使用*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 
于 2014-11-12T01:37:20.917 回答
1

为了回答您做错了什么,您编写的代码不需要 splat ( *) 运算符(它也不需要修补到Array类中)。虽然 patching intoArray和 usingself允许您将其称为 like [1,2].second,但您也可以将其编写如下而不用 patching into Array

def second(arr)
  arr.length <= 1 ? nil : arr[1]
end

这需要像second([1,2]).

要了解有关 splat 运算符的更多信息*,请尝试类似这样的解释(我承认 - 第一个 Google 结果,但似乎还可以),但它在您的示例中所做的是将您传入的数组转换为数组的数组 - 例如[1,2,3]变成[[1,2,3]].

于 2014-11-12T01:57:22.157 回答