2014-11-12 8 views
1

이것이 작동하지 않는 이유를 모르겠습니다. 프로그램은 클래스 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 

무엇이 잘못 되었나요? 클래스 배열을 제거하고 두 번째 테스트가 잘되면?

+0

'second'메서드를 호출하는 것처럼 보이지 않습니다. –

+0

그래서 내가 어떻게하면 지금까지 시도한 결과가 NoMethodError – user3466773

답변

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 
+0

라고 계속 말합니다. 나는 자기가 무엇인지 정말로 알지 못했다. Ruby를 처음 접했고 Ruby의 클래스 표기법에 새로운 것이 었습니다. 하하 감사합니다. – user3466773

+0

여기에서 몇 가지 질문을하는 것을 보았습니다. 특정 답변이 유용하다고 생각하면 환영합니다. 왼쪽의 확인란을 클릭하십시오. – daremkd

+0

이제부터 염두에 두겠다. – user3466773

0

을 당신이 잘못하고있는 일, 플랫 필요하지 않습니다 작성된 코드는 (*) 연산자 (그것도하지 않습니다 Array 클래스에 패치해야합니다. Array에 패치 및 self를 사용하여 당신이 [1,2].second처럼 호출 할 수 있지만 다음과 같이, 당신은 또한 Array에 패치없이 쓸 수있다 : 필요

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

second([1,2])처럼 호출 할 수 있습니다.

splat 연산자 *에 대해 자세히 알아 보려면 this explanation (고백 - 첫 번째 Google 결과이지만 괜찮음)과 같은 것을 시도해보세요.하지만 예제에서 전달한 배열을 배열로 변환하는 것이 무엇입니까? 배열 - 예. [1,2,3][[1,2,3]]이됩니다.

+0

Array 클래스 안에 메서드를 두 번째로 정의해야한다는 요구 사항이있었습니다. 스켈레톤 클래스 Array; 끝이 주어졌다. – user3466773