我正在尝试在 Smalltalk 中创建实时编码环境。我正在使用的对象有很长的复杂方法,其中包含许多用于创建新实例的参数。我希望能够编写一个非常简短的“命令”,它只指定我感兴趣的参数并为所有其他参数提供默认值。
例如,而不是写这样的东西:
Polyhedron shape: #cube size: 1 rotationSpeed: 5 rotationDirection: 0.707 color: red texture: false
在我的实时编码环境中,我想写:poly shape: #cube
一些参数可能很复杂并且包含它们自己的信息,例如:poly shape: #cube rotationSpeed: ((pot1 max: 0) min: speedLimit)
因此,与其仅仅尝试自己解析实时编码字符串,我认为如果我可以使用 Smalltalk 的内置解析器或编译器来解码字符串并调用 Polyhedron
会更容易。带有完整的创建消息,包括默认值。我该怎么做?
我已经从解析器中获取了一组 token ,但这并不能识别消息参数和参数。在我尝试自己实现参数解析之前,我认为 Smalltalk 中可能有一些东西可以给我一个消息参数和参数列表?
最佳答案
看起来您不必调整编译器。要提供默认值,只需让您的对象天生就有。如何?在初始化方法中:
Polyhedron >> initialize
super initialize.
shape := #triangle.
size := 1.
rotationSpeed := 5.
rotationDirection := 0.707.
color: Color red texture: false
#initialize
当您发送 Polyhedron new
时发送消息.因此,如果你想改变形状,你只需要发送Polyhedron new shape: #cube
顺便说一下,发送 super initialize
通常是个好主意。所以给父类(super class)一个机会来执行它们的初始化例程。另请注意,Polyhedra 是 Polyhedron 的复数形式,类名通常是单数形式。
附录
如果您无法编辑类(class)
Polyhedron
,您仍然可以引用它并因此向它发送消息。特别是,您可以创建新的实例创建方法,比您已有的方法更短。以下是如何执行此操作: Polyedron compile: 'shape: aSymbol
^self
shape: aSymbol
size: 1
rotationSpeed: 5
rotationDirection: 0.707
color: Color rd texture: false'
注意#compile:
的参数是您要添加的方法的源代码。通过使用这种新方法,您将能够说Polyedron shape: #cube
得到你想要的。
关于smalltalk - 我如何使用 Smalltalk 的内置解析器或编译器来解析我自己的带有可选参数的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62608963/