2009-10-29 5 views
8

스몰 토크에서 두 개의 문자열을 비교하려고하는데, 잘못된 것 같습니다.스몰 토크 - 두 문자열을 비교하여 동일성을 비교하십시오.

처리되지 않은 예외 : 비 부울 수신기

나는이 오류가 계속. 진실을 위해 진행하십시오.

stringOne := 'hello'. 
stringTwo := 'hello'. 
myNumber := 10. 

[stringOne = stringTwo ] ifTrue:[ 
    myNumber := 20]. 

내가 뭘 잘못하고 있는지 아는 사람이 있습니까?

답변

16

난 당신이 좋은 설명을 찾을 수 첫 번째 줄

에 대괄호 필요가 있다고 생각하지 않습니다

stringOne = stringTwo 
    ifTrue: [myNumber := 20]` 

을보십시오. 전체 thing is here

스몰 토크에서 불리언 값 (즉, 참 또는 거짓)은 개체입니다. 즉, 추상 기본 클래스 부울의 인스턴스화 또는 True 및 False 두 하위 클래스의 인스턴스화입니다. 따라서 모든 부울은 True 또는 False 유형을 가지며 실제 구성원 데이터는 없습니다. Bool에는 두 개의 가상 함수 ifTrue : 및 ifFalse :가 있으며 인수로는 코드 블록을 사용합니다. True와 False 모두이 함수를 무시합니다. True의 ifTrue 버전 : 전달 된 코드를 호출하고 False 버전은 아무 것도하지 않습니다 (ifFalse의 경우도 마찬가지입니다 :). 다음은 그 예이다 : 대괄호

a < b 
    ifTrue: [^'a is less than b'] 
    ifFalse: [^'a is greater than or equal to b'] 

그런 것들은 그런데, 기본적으로 익명 함수입니다. 모든 것이 스몰 토크의 대상이기 때문에 그것들은 객체입니다. 자, 여기서 일어나는 일은 우리가 "<"메쏘드를 인자 b로 호출하는 것입니다; 이는 boolean을 반환합니다. 우리는 ifTrue : 및 ifFalse : 메소드를 호출하여 두 경우 모두에서 원하는 코드를 인수로 전달합니다. 그 효과는 루비 코드와 동일합니다

if a < b then 
    puts "a is less than b" 
else 
    puts "a is greater than or equal to b" 
end 
+0

내 동료 Android에 감사드립니다. 그것이 문제였습니다. – user69514

+0

Woof - 나는 스몰 토크에 익숙하지 않다. 그러나 대괄호는 평가를위한 것이고 만약 당신이'= '연산자를 평가한다면 당신은 부울을 얻지 못할 것이다 : – Bostone

+0

sigh - 여기에 예제 코드를 추가하고 싶었지만 그것은 형식이 잘못되었습니다. 그것을 잊어 버려, 나는 대답을 추가했다 ... – blabla999

0

비교를 차단 하시겠습니까? 나는 그것을 생각했을 것입니다 :

(stringOne = stringTwo) ifTrue: [ myNumber := 20 ] 

으로 충분할 것입니다.

+1

괄호는 불필요하고 비정형 적이다. 사실, 나는 괄호가 필요한 표현식 (특히 중첩 된 괄호)을 작성하는 경우 작업을 복잡하게 만들고 명명 된 임시 또는 별도의 메소드 호출을 사용하여 리팩토링 할 수 있습니다. –

1

[stringOne = stringTwo]은 부울이 아니라 블록입니다. 블록이 호출되면 아마도 부울이 생깁니다. 그러나 당신은 여기에 블록을 호출하지 않습니다. 대신 블록을 ifTrue의 수신자로 만들뿐입니다.

대신, 시도 : 다른 사람이 말했듯이

(stringOne = stringTwo) ifTrue: [ 
    myNumber := 20 ]. 
4

, 당신이 대괄호의 첫 번째 집합을 없애 경우에 당신이 원하는 방식으로 작동합니다. 당신은 더 나은에 실행 된 문제를 설명하는 그러나

:

[stringOne = stringTwo ] ifTrue:[myNumber := 20] 

가 블록에 메시지 ifTrue:를 전달하고, 블록이 그 방법을 이해하지를, 전용 부울 객체는 않습니다.

먼저 블록을 평가하는 경우, 그것은 진정한 다음 응답하는 방법을 알 객체로 평가됩니다

[stringOne = stringTwo] value ifTrue:[myNumber := 20] 

또는 어떤 다른 사람이 지적한대로 당신이 정말로, 수행해야합니다

stringOne = stringTwo ifTrue:[myNumber := 20] 

모두 을 보내기 전에 stringOne = stringTwo에서 true으로 평가됩니다.

0

but I seem to be doing something wrong

에게 문서 폴더을 포함해야 설치하려면 VisualWorks를 사용하고 있음을 감안할 때.

AppDevGuide.pdf - VisualWorks 프로그래밍에 대한 많은 정보가 있으며 여기에는 스몰 토크 프로그래밍에 대한 많은 소개 정보가 있습니다.

7 장 "제어 구조"까지 "시작"부분을 살펴보고 "분기"또는 "조건 테스트"를 클릭하면 pdf의 해당 섹션으로 이동합니다. Smalltalk if-then-else 및 잘못된 것을 보여주는 데 도움이되었을만한 예제를 제공합니다.

0

나는 다음과 같은 50Cent을 추가하고 싶습니다 :

블록 주위에 전달 될 수 람다는 실제로 같은 다른 좋은 예는 다음과 같은 방법이 될 것입니다 : 그래서

do:aBlock ifCondition:aCondition 
    ... some more code ... 
    aCondition value ifTrue: aBlock. 
    ... some more code ... 
    aBlock value 
    ... 

ifTrue의 인수 :/ifFalse : 실제로 다른 사람이 올 수 있습니다. 이런 종류의 전달 된 조건은 종종 "..ifAbsent :"또는 "..onError :"종류의 메소드에서 유용합니다.

(원래는 주석으로 지정했지만 형식화되지 않은 코드 예제는 얻을 수 없습니다.)