SmallTalk의 범위에서 임의의 정수를 어떻게 생성 할 수 있습니까?
-
06-07-2019 - |
문제
현재 수업을 받고있는 수업은 SmallTalk (디자인 클래스)에서 모든 코딩을 수행해야합니다. 우리 프로젝트 중 하나에서, 나는 몇 가지 일을하려고 노력하고 있으며, 방법을 찾는 데 어려움을 겪고 있습니다. 대부분의 사람들이하는 일은 자신의 스몰 토크 버전을 수정하여 필요한 일을하는 것 같습니다. 나는 이렇게 할 수있는 자유가 아닙니다. 이것이 제가하는 내장 방법과 동일한 내장 방법이 없을 때 내 교수의 컴퓨터에 오류가 발생할 것이기 때문입니다.
내가 찾고자하는 일은 다음과 같습니다.
랜덤 숫자. 1에서 1000 사이의 임의 숫자를 만들어야합니다.
rand := Random new.
rand := (rand nextValue) * 1000.
rand := rand asInteger.
이것은 나에게 0에서 1000 사이의 숫자를 준다. 한 명령으로 이것을 할 수있는 방법이 있습니까? 비슷하다
Random between: 0 and: 1000
및/또는 진술. 이것은 살아있는 일광이 나에게서 버그를냅니다. 몇 가지 다른 구성을 시도했습니다
(statement) and: (statement) ifTrue...
(statement) and (statement) ifTrue...
그래서 나는 중첩 된 iftrue 진술로 가짜입니다.
(statement) ifTrue:[
(statement) ifTrue:[...
SmallTalk에서 올바른 방법 및/또는 임의의 방법은 무엇입니까?
해결책
문제는 그 것입니다
(expr) and: (expr) ifTrue: aBlock
방법으로 구문 분석됩니다 and:ifTrue:
부울 클래스 (그리고 특히 참 또는 거짓)를 보면, 당신은 iftrue : 단지 규칙적인 방법이며, 방법이 없으며 : iftrue : 존재합니다. 그래서 이것들이 두 가지 메시지임을 분명히하기 위해
((expr) and: (expr)) ifTrue: aBlock
더 긴 부울 조합의 경우 방법과 : 및 : and : and : 구현이 있습니다.
다른 팁
(1 to: 1000) atRandom
VisualWorks를 사용하고있는 경우 : 블록을 인수로 취하므로 다음을 작성합니다.
(aBoolean and: [anotherBoolean]) ifTrue: [doSomething].
또한 있습니다 &
, 인수로 블록을 취하지 않는다.
aBoolean & anotherBoolean ifTrue:[doSomething].
차이점은 다음과 같습니다. 첫 번째 bool이 참이면 (Java와 유사), 반면, 블록의 내용 만 평가합니다. &
항상 둘 다 평가합니다.
따라서 and:
두 번째 조건이 계산적으로 비싸거나 첫 번째 조건이 참을 때만 발생 해야하는 상태 변경이 포함 된 경우 유용합니다. (그래도 그것은 일반적으로 나쁜 디자인입니다).
사용자 정의 방법을 제공하는 한 무작위에 관해서는 Random >> between: and:
코드의 나머지 부분뿐만 아니라 교수 컴퓨터에서 잘 실행됩니다. 구체적으로 수행하는 방법은 과제를 전달 해야하는 형식에 따라 다릅니다.
임의의 문제에 관해서는 : 그것은 당신이 사용하는 ST 버전에 따라 다릅니다. Squeak 3.9에는 있습니다 Random>>#nextInt:
, "간격 [1, aninteger]의 임의의 정수에 대답합니다."로 문서화됩니다. 구현이 읽습니다
(self next * anInteger) truncated + 1
그래서 여기에는 두 가지 의견이 있습니다.
- 클래스 브라우저를 사용하는 법을 배워야합니다. 이것은 (빈번한) 질문에 "클래스 X의 객체에 어떤 메시지를 보낼 수 있는지"질문에 대답 할 수 있습니다.
ST에서는 기존 클래스에 새로운 방법을 추가하는 것이 일반적입니다. 그래서 당신이 무작위로 가고 싶다면 : 그리고 :, 그냥 추가하십시오.
between: low and: high ^(self next * (high-low+1)) truncated + low
간단히 말해서, SmallTalk 방언을 알지 못하면 일반적인 대답 만 할 수 있습니다. 당신이 임의의 질문을 언급 한 방식, 그렇습니다. 교수가 일반적인 답변이 필요하다면 그렇게하는 유일한 방법입니다.
및/또는 진술 질문에 관해서는
및/또는 진술. 이것은 살아있는 일광이 나에게서 버그를냅니다. 몇 가지 다른 구성을 시도했습니다
(statement) and: (statement) ifTrue...
(statement) and (statement) ifTrue...
시도하고 싶은 것은 다음과 같습니다.
(statement) and: [statement] ifTrue: [ ... ]
괄호 안에 주목하십시오.
1에서 1000 사이의 몇 개의 임의 정수를 생성합니다
먼저 난수 시리즈를 만듭니다. 이것을 한 번만하십시오.
그런 다음 시리즈에서 다음 번호를 가져 와서 새 랜덤 번호를 만듭니다. 필요에 따라 반복하십시오.
aRandomSeries := Random new .
"Seed a new series of random numbers"
aRandomInt := aRandomSeries newInt: 1000 .
"generate a random integer between 0 and 1000"
anotherRandomInt := aRandomSeries newInt: 1000 .
"generate another random integer between 0 and 1000"
논리적 작업
aBoolean
응답 할 것입니다 and:
그리고 or:
. 둘 다 가져갑니다 블록 인수.
그들이 작동하는 방법은 다음과 같습니다.
and: alternativeBlock
수신기가 참이면 대체 블록의 값에 답하십시오. 그렇지 않으면 대체 블록을 평가하지 않고 False에 대답하십시오.
or: alternativeBlock
수신기가 False 인 경우 대체 블록의 값에 답하십시오. 그렇지 않으면 대체 블록을 평가하지 않고 true에 답하십시오.
예를 들어
( 3 > 2 ) or: [ 3 < 4 ] ifTrue: [ ]
aBoolean and: [ anotherBoolean ] ifFalse: [ ]
그러나 Squeak와 Pharo Smalltalks는 둘 다 괄호 안에서 논쟁을 받아 들일 것입니다. ( )
Dolphin Smalltalk는 블록 인수의 표준 SmallTalk 구문을 엄격하게 요구하지 않을 것입니다.
기타 관련 방법 :
&
an 그리고 사각형 브래킷 (IE 블록) 인수가 필요하지 않습니다.
|
an 또는 사각형 브래킷 (IE 블록) 인수가 필요하지 않습니다.
&
그리고 |
Amber, Cuis, GNU, Pharo, Squeak, VisualAge 및 VisualWorks SmallTalks에서 일하십시오.
Squeak SmallTalk도 다음을 제공합니다.
and:and: }
and:and:and: }
이것들은 여러 블록 논증을 취합니다
and:and:and:and }
or:or: }
or:or:or: }
이것들은 여러 블록 논증을 취합니다
or:or:or:or: }