3

これがどのように機能しないのかわかりません。プログラムは、クラス Array で 2 番目のインスタンス メソッドを取得し、配列の 2 番目のオブジェクトを返すことになっています。

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 番目にテストすると、正常に動作しますか?

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にパッチしArrayて使用selfすると、のように呼び出すことが[1,2].secondできますが、にパッチを適用せずに次のように記述することもできますArray

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

のように呼び出す必要がありますsecond([1,2])

splat operator の詳細については、この説明*のようなものを試してください(私は告白します - 最初の Google の結果ですが、問題ないようです)。ただし、例で行っているのは、渡された配列を配列の配列に変換することです。になります。[1,2,3][[1,2,3]]

于 2014-11-12T01:57:22.157 に答える