我正在研究 Smalltalk 反射,我想知道是否有可能像在 Ruby 中那样扩展单个对象。我的意思是一个只有特定对象响应的选择器。
这是一些说明我的意思的 Ruby 代码。澄清一下:在 Ruby 中,这会为此对象打开一个虚拟类,并使用新定义对其进行扩展。这里最重要的部分是类定义没有任何变化!
o = Object.new
o.instance_eval {def foo;puts "foo";end}
o.foo #=> "foo"
#however this will fail:
m = Object.new
m.foo #=> NoMethod error
更具体地说,我的问题是这在标准 Squeak/Pharo 或其他 smalltalk 实现中是否可能,而无需添加大量结构或代码来实现这一点。换句话说,Smalltalk 中存在常规反射功能。
例如,可以添加方法、删除方法、将新代码编译到类中、更改实例变量等等,但我还没有找到扩展单个对象的方法。
Test addInstVarNamed: #var.
Test compile: 'var ^var'.
t:= Test new.
Test instVarNames.
t instVarNamed: #var put: 666.
t var. #=> 666
如果答案是否定的,请解释原因。我不是要解决这个问题,而是要理解为什么它不在 smalltalk 中。