배열의 하위 클래스를 만들고 지금까지 잘 수행 된 일부 메시지를 작성했습니다.Squeak 문자열 배열 및 반복
startString: charToTest
"Returns a list of all the words that start with a given character"
| toReturn i j numWords |
i:= 1.
j:= 1.
numWords := 0.
[i <= self size.] whileTrue: [
(((self at: i) at: 1) = charToTest)
ifTrue: [numWords := numWords + 1].
i:= i+1.
].
toReturn := MyArray new: numWords.
i := 1.
[i <= numWords.] whileTrue: [
(((self at: i) at: 1) = charToTest)
ifTrue: [toReturn at: j put: (self at: i). j := j+1].
i := i + 1.
].
^toReturn
그래서, 본질적으로,이 방법 자체를 살펴보고 새로운 배열로 시작하는 단어의 수의 크기를 만듭니다 그러나, 나는 지금 여기 내 코드의 본문의 마지막 메시지에 문제가있어 캐릭터. 그런 다음 다시 반복하여이 단어를 새로운 배열로 변환하여 반환합니다. 내 작업 공간은 정확히 다음과 같습니다
|freshArray testArray|
freshArray := MyArray new: 5.
freshArray
at: 1 put: 'some';
at: 2 put: 'things';
at: 3 put: 'are';
at: 4 put: 'simple';
at: 5 put: 'things'.
testArray := freshArray startString: $s
내 작업 영역에서이 코드를 선택하여 인쇄 할 때 방법은 거의 올바른 입니다. 그러나 아주. 어떤 이유로 "toReturn"의 두 번째 슬롯이 채워지지 않습니다. 출력은 다음과 같습니다.
a MyArray('some' nil)
왜 이런 현상이 발생합니까? if 문 다음에 두 번째 반복 루프에서 내 문장을 올바르게 구분합니까? 나는 내가 잘못한 것을 진정으로 혼란스러워합니다. 어떤 도움을 주시면 감사하겠습니다!
이것은 정확한 답변입니다. 제 생각에는 do를 사용하는 것이 맞다고 생각합니다 : 루프도 마찬가지입니다. 돌아가서 다른 반복을 변경하여 클리너를 만들어 보겠습니다. 다시 한 번 고마워, 나는 나 자신을 알아 차리지 못했다고 믿을 수 없다. – Ryanman