문제

현재 수업을 받고있는 수업은 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

그래서 여기에는 두 가지 의견이 있습니다.

  1. 클래스 브라우저를 사용하는 법을 배워야합니다. 이것은 (빈번한) 질문에 "클래스 X의 객체에 어떤 메시지를 보낼 수 있는지"질문에 대답 할 수 있습니다.
  2. 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: }

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top