5

在Kent Beck 的Smalltalk Best Practice Patterns一书中,双大号 ( >>) 用于定义如下方法:

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

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

但是,我无法让它在 GNU Smalltalk 中运行。

在 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:

但是请注意,这里我们发送 #class 因为 #x:y: 是类端方法。如果你想访问一个实例端方法,比如#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 回答