2010-08-19 6 views
0

먼저이 문제의 기원을 추적하는 데 어려움을 겪고 있기 때문에 얼마나 많은 정보가 포함되어야하는지 잘 모르겠습니다.클래스의 속성을 설정할 수 없음

$genre = Movie::Genre->new({ 
    genreName => 'Drama', 
    genreID => '1' 
       }); 

문제는, 그것은하지 않습니다 :

나는 (몇 가지 다른 것들과 함께)이 같은 클래스의 속성을 설정하려고 서브 루틴 무스 역할을한다. 직후 $genre의 덤프는 여전히 비어 있음을 나타냅니다 :

$genre: bless({ 
      genreID => '1', 
      genreName => 'Drama' 
      }, 'Movie::Genre') 
: 내 테스트 파일에 동일한 라인을 실행할 때이 덤프 예상대로

$genre: bless({}, 'Movie::Genre')

낯선 여전히, 작동

나는이 두 줄의 코드를 다른 것으로 만들어서 하나는 작동시키고 하나는 실패하게 만드는 것을 찾기 위해 고심하고 있습니다.

어떤 조건으로 인해 첫 번째 예가 실패하고 두 번째 예가 성공할 수 있는지에 대한 아이디어가 있습니까? 필요한 경우 더 많은 컨텍스트를 제공하게되어 기쁩니다. 감사!

답변

2

이 줄은 단순히 이러한 매개 변수를 Movie :: Genre 생성자로 전달합니다. 그 생성자가 그들과 함께 할 일을 결정하는 것은 그 생성자의 몫입니다.

Movie :: Genre 클래스가 genreNamegenreID이라는 속성을 획득하기 전에 (역할에서) 호출이 실행되는 것처럼 들리는 것 같습니다. 기본적으로 무스 생성자는 인식 할 수없는 매개 변수를 무시하므로 경고를 생성하지 않습니다.

테스트 파일은 속성이 Movie :: Genre에 추가 된 후에 해당 호출을 만들어야합니다.

왜 이런 일이 발생하는지 정확히 알아 내기 위해 더 많은 코드를 살펴 봐야합니다.

+0

감사합니다 - 당신이 옳았습니다. 나는 긴 역할의 사슬을 가지고 있었고, 누가 먼저 전화하고 누가 개편 하는지를 조사한 후에 문제가 해결되었다. – Ryan

+0

여러 개의 역할 (긴 체인)을 작성하는 좋은 방법은'with qw (Role1 Role2 Role3);를 한 번 호출하는 것입니다. 이 방법으로 구성이 정렬되지 않으면 영향을 미치지 않습니다. 그러나 실제로는 이것이 매번 작동하지 않을 수 있으므로 (구현의 특징으로 인해)'with() '를 여러 번 호출하면 순서가 지정된 구성을 만들 수 있습니다. – perigrin

관련 문제