5

KentBeckの著書「 SmalltalkBestPracticePatterns」では、次の>>ようなメソッドを定義するために2倍の大なり記号( )が使用されています。

Point class>>x: xNumber y: yNumber
    ^self new
        setX: xNumber
        y: yNumber

Point>>setX: xNumber y: yNumber
    x := xNumber.
    y := yNumber.
    ^self

ただし、GNUSmalltalkで実行することはできません。

Smalltalkの一部の実装では有効な構文ですか?それとも単なる擬似コードですか?

4

3 に答える 3

5

実際、これは疑似コードです。

他の言語.では、メソッドがこのクラスにあることを人々に伝えるために を使用しますが、smalltalk では次のように記述します。>>

SqueakPharoのような Smalltalk で行うこと

Point class>>x: xNumber y: yNumber
    ^self new
        setX: xNumber
        y: yNumber
  1. システム ブラウザを開く
  2. クラスをクリックすると、クラスのクラス側が表示されます。
  3. メソッドをソース コードとともにテキスト領域に貼り付けます。

    x: xNumber y: yNumber
        ^self new
            setX: xNumber
            y: yNumber
    
  4. コードを保存するための Strg-s

為に

Point>>setX: xNumber y: yNumber
    x := xNumber.
    y := yNumber.
    ^self

同じことをしますが、クラス側は使用しません

于 2013-03-10T11:54:31.720 に答える
4

また、実際、#>>はクラスに送信できるメッセージであり、基本的にシンボル(セレクター引数)のメソッドディクショナリにアクセスすることに注意してください。動作クラス、メソッド>>を参照してください。

  >> selector 
"Answer the compiled method associated with the argument, selector (a 
Symbol), a message selector in the receiver's method dictionary. If the 
selector is not in the dictionary, create an error notification."

^self compiledMethodAt: selector

たとえば、次のことができます(それを調べてください)

  Point class >> #x:y:

ただし、#x:y:はクラス側のメソッドであるため、ここでは#classを送信することに注意してください。インスタンス側のメソッドにアクセスする場合は、たとえば#normalizedとすると、次のことができます。

  Point >> #normalized
于 2013-03-10T16:06:04.637 に答える
2

GNU Smalltalk の正しい構文は次のようになります。

Point class extend [
    x: xNumber y: yNumber [
        ^self new
            setX: xNumber
            y: yNumber ]
]

Point extend [
    setX: xNumber y: yNumber [
        x := xNumber.
        y := yNumber.
        ^self ]
]

GNU Smalltalk 構文の詳細については、こちらを参照してください。

于 2013-03-11T08:54:08.730 に答える