我目前正在研究Smalltalk。
有什么方法可以在变量内存储函数或方法?
例如,在Python中可以说:
x = someobject.method
x() # calling it
在Smalltalk中这可能吗?将something.method
自身作为参数传递给另一种方法呢?
您可以通过向类对象询问具有给定名称的方法来获得方法对象。下面>>
是一条以Object
方法名称作为参数发送到类的消息。
Object >> #asString
这将返回type的实例CompiledMethod
。这是表示方法的对象。像任何对象一样,您可以将其存储在变量中。
copyMethod := Object>>#asString.
例如,如果您在Pharo a Playground中打开并查看上面的代码,您将获得:
然后,您可以使用消息执行该方法#valueWithReceiver:arguments:
。这需要接收者(自身/本)和可能的参数作为参数。
result := copyMethod
valueWithReceiver: Object new arguments: #().
但是,这是执行方法的底层方法。
我会说更常见的是直接在对象上执行具有给定名称的方法。可以使用perform:
或来完成perform:withArguments:
。您可以使用方法名称作为参数将其发送到对象
receiver := Object new.
receiver perform: #asString.
上面的代码执行asString
在接收器对象上命名的方法。这通常用于传递我们需要执行的方法的名称。不同之处在于的实例CompiledMethod
是不可变的。如果更改该方法的代码,则会创建一个新实例,并且最终可以执行该方法的旧版本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句