2016-10-17 2 views
1

저는 스몰 토크를 처음 접했고 스택에서 요소를 출력하는 방법에 대해 고심하고 있습니다. 두개의 클래스가 있는데 하나는 작동하는 OrderedCollection과 두 번째 클래스 (Object 서브 클래스)를 사용하여 스택을 생성합니다. 두 번째 클래스의 경우 두 개의 인스턴스 변수 인 name 및 weight (set 및 get 메서드 사용)가 있습니다. print 및 printSpecial 메서드를 두 가지 더 만들 필요가 있습니다. 이름에서 get 메소드를 사용하여 동일한 행의 스크립트에 이름과 가중치를 출력하지만 가중치에서 get 메소드를 사용할 수는 없습니다. PrintSpecial은 print와 비슷하지만 무게는 <이어야합니다. print 및 printScpecial을 시도했지만 시도 할 수 없습니다. 아래는 제가 지금까지 가지고있는 것입니다. 어떤 도움을 주시면 감사하겠습니다.Smalltalk의 OrderedCollection에서 인쇄하기

name: a 
    name := a 

name 
    ^name 

print 
    [ Transcript 
     show: weight; 
     show: name; 
     cr ] 

printSpecial 
    [ weight <= 100 ] 
     whileTrue: [ Transcript 
      show: weight; 
      show: name; 
      cr ] 

답변

4

모두 당신의 printprintSpecial 방법은 제곱 괄호 안에 몸을 묶습니다. 그들을 제거해야합니다. 시도 : printSpecial에 내가 ifTrue:whileTrue:을 대체 한 것을

print 
    Transcript 
    show: weight; 
    show: name; 
    cr 

printSpecial 
    weight <= 100 ifTrue: [ 
    Transcript 
     show: weight; 
     show: name; 
     cr] 

공지 사항. 그 이유는 weight이이 조건을 충족하는 경우 영원히 인쇄를 계속하고 싶지 않기 때문입니다.

코드를 반복하지 않는 것이 좋습니다. 그래서,이 제안 것이다 :

printSpecial 
    weight <= 100 ifTrue: [self print] 

이 방법을 사용하면 나중에 printSpecial에 개선을 복사 할 필요가 없습니다 print을 개선하기로 결정한 경우.

마지막으로 이러한 개체의 컬렉션이 있다고 가정합니다. 따라서 그들을 열거 할 수있는 방법이 있어야합니다 (예 : do: 통해). 따라서 실제 요청이 모두 인쇄로 구성된 경우 요소 클래스에 printprintSpecial을 구현 한 다음 Stack 클래스에 동일한 메시지를 구현해야합니다. 나는 당신의 요소를 보유하고있는 인스턴스 변수가 collection라는 있으리라 믿고있어

Stack >> print 
    collection do: [:elem | elem print] 

Stack >> printSpecial 
    collection do: [:elem | elem printSpecial] 

.

더욱 좋습니다. 을 Stack 클래스에 구현 한 다음 위에서 수행 한 것처럼 collection do: 대신 self do:을 사용하면됩니다.

Stack >> do: aBlock 
    collection do: aBlock 

의 라인에 뭔가 다음

Stack >> print 
    self do: [:elem | elem print] 

Stack >> printSpecial 
    self do: [:elem | elem printSpecial] 
+0

이가 많은 도움 감사합니다. – user2871898