在Smalltalk中定义double大于号(>>)的方法

时间:2013-03-10 11:48:10

标签: smalltalk gnu-smalltalk

在肯特贝克的书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的某些实现中,它是有效的语法吗?或者它只是一种伪代码?

3 个答案:

答案 0 :(得分:5)

实际上这是伪代码。

在其他语言中,您可以使用.告诉人们该方法在此课程中,但是在小写中您编写>>

你会在像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保存代码

  5. 对于

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

    你会做同样但不使用课程

答案 1 :(得分:4)

另外,请注意,确实,#>>是一个可以发送给类的消息,它基本上访问符号的方法字典(selector参数)。请参阅行为类,方法>>

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

答案 2 :(得分: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语法的更多信息,请参阅here