블로그 이미지
초딩입맛제주아재
하고 싶은 것만 하며 살고 싶다

calendar

            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
2006. 10. 9. 10:15 Programing/Smalltalk

payroll := OrderedCollection new.

attendanceDate := Date fromString: '2006-10-1'.
attendanceTime := Time fromString: '10:00'.
attendanceDateTime := TimeStamp date: attendanceDate time: attendanceTime.

finishDate := Date fromString: '2006-10-1'.
finishTime := Time fromString: '19:00'.
finishDateTime := TimeStamp date: finishDate time: finishTime.


날짜와 시간으로 출근시간과 퇴근시간에 해당하는 timestamp 를 만들어서
patroll 에 한쌍으로 묶어서 넣으려고 하는데 들어가질 않습니다.

자동완성이 되지 않아 직접 타이핑으로
payroll add: #(attendanceDateTime finishDateTime).
입력을 했더니 입력은 됐으나 이상한 형태로 되었더군요.

#(#attendanceDateTime #finishDateTime)

어떠한 형태의 객체도 다 포함하는 줄 알았던 컬렉션 객체가 말썽을 부리니
멍해지네요 -_-;;

달룟님의 답변

지적하신 부분은 "어떠한 객체도 다 담을 수 있다."와는 상관이 없습니다. Smalltalk문법에서 #(변수명, 변수명) 는 허용되지 않는 표현입니다. #(표현식, 표현식) 역시 마찬가지입니다. #()속에는 literal만 올 수 있습니다. 이 부분은 Ruby에 비해서 불편한 점으로, Smalltalker들 중에는 이 문법을 고치자는 주장도 나오고 있습니다.
파란글씨로 표시된 것처럼, Symbol객체 2개로 된 배열로 인식됩니다. 컴파일된 소스색깔을 보시면 변수명이 아니라 literal로서 컴파일 되었음을 알 수 있습니다.

원하시는 표현은 Array with: attendanceDateTime with: finishDateTime 입니다.


#()는 Array객체를 간략한 표현으로 생성하는 문법입니다. #()로 OrderedCollection객체를 만들 수는 없습니다. 변환은 가능하죠.

#(1 2 3) asOrderedCollection.

혹은

OrderedCollection withAll: #(1 2 3).

with:with:는 Collection 클래스에 있는 매쏘드이기 때문에 Array, OrderedCollection모두 쓸 수 있습니다.

OrderedCollection with: attendanceDateTime with: finishDateTime.

이라고 하면 되죠.



이렇게 하니 된다.

payroll add: (Array with: attendanceDateTime with: finishDateTime).
payroll size. > 1
(payroll at: 1) size. > 2


Collection >> OrderedCollection,Array,SortedCollection...

posted by 초딩입맛제주아재

댓글을 달아 주세요