2017-10-24 17 views
2
a := 12/24. 

a는 분수가 할당 된 변수 12/24입니다. 인쇄 할 때 1/2이 답입니다. 이제 inspect 팝업 창을 열어 분자와 분모의 값을 변경하고 이전과 같은 대답을 추측합니다 (1/2). 실제로 일어나는 일은 출력이 12/24인데, 이는 나에게 이상한 일입니다.스퀵 스몰 토크 (Squeak Smalltalk) : 검사 윈도우에서 분자와 분모 값을 수정 한 후에 분수가 감소하지 않는 이유는 무엇입니까?

이 문제를 이해할 수 있도록 동영상을 녹화했습니다.

https://www.youtube.com/watch?v=LNj24f2wP0M

이유는 분자와 분모 값이 검사 창에서 수정 한 후 일부의 감소가 발생하지 않습니다?

+1

안녕하세요, 사람들이 YouTube에 가지 않고 문제를 설명해주세요. 값을 어떻게 변경하려고합니까? 변경 사항을 적용합니까? "대답"이란 무엇을 의미합니까? '대본보기 : a'또는 이와 비슷한 뜻입니까? 디버깅을 시도 했습니까?개체의 인쇄 방법을 단계별로 실행 하시겠습니까? –

+0

https://stackoverflow.com/questions/46942103/squeak-smalltalk-why-sometimes-the-reduced-method-doesnt-work Bert Freudenberg의 답변에서 분수 감소가 분자와 분모가 자동으로 발생하지 않는 이유에 대한 답변을 참조하십시오. 수동으로 생성됩니다. 그러나 아직도 왜. –

답변

2

내 대답은 Pharo 방언을 기반으로합니다. 나는 스퀵이 강하지 않다는 것을 믿습니다. 정수를 처음으로 나눕니다. 방법을 줄일 호출하는 조각은 >> 정수에서가/

(Fraction numerator: self denominator: aNumber) reduced 

주의하십시오.

Inspector 도구에서 denominator/nominator를 변경 한 후에 reduce 메서드를 호출하면 fraction 개체도 축소됩니다.

+0

감사합니다. –

3

설명하는 동작이 정확하며 의도 한 동작입니다. 그것은을 준수하기 때문에 방법 1이 바람직하다

검사관에서 자신의 인스턴스 변수를 수정 그들을

  • 에 메시지를 보내기

    1. : 당신은 두 가지 방법으로 개체를 수정할 수있는 개발자로서

      어형 변화표. 그래서, 우리는 왜 방법 2를 가지고 있습니까? 인스펙터를 열면 어떻게 든 오브젝트를 사칭하기 때문입니다. 즉, 검사 대상이되므로 귀하는 자신을 수정할 권리가 있습니다.

      물론 내부 상태를 수정하면 불변량을 유지하는 것은 사용자의 책임입니다. 분수의 경우, 두 가지 불변이 있습니다 : 합계에서

      1. denominator > 0
      2. (numerator gcd: denominator) = 1

      는, 검사관은 당신이 일을하고 모든 인스턴스 변수를 수정할 수 무슨 알고 있다고 가정합니다 네가 원하는대로. 그러나 메시지를 보낼 때 객체는 불변성이 유지되는 방식으로 동작해야합니다.

      물론 개인용 방법은주의를 기울여 처리해야합니다 (공용 방법으로 만 전송해야 함). 그러나 일반적으로 개체를 직접 조작하는 것은 좋은 일이며 장애물이나 안전 장치가되지 않습니다.