对象名称在Logtalk中作为变量

时间:2018-12-17 08:55:18

标签: database object variables logtalk

是否可以将对象名称作为变量?我正在尝试建立一个数据库,每个对象代表每个人。我有[name / 1,firstname / 1]的物件,但是当我问

  

X :: name(john)。

它给我一个错误。 Ofc使用这种方法获取原子没有问题:

  

object_id :: name(X)。

1 个答案:

答案 0 :(得分:0)

::/2消息发送控件构造确实在调用时需要绑定的第一个参数。但是您可以使用current_object/1内置谓词枚举现有对象:

| ?- current_object(Person), Person::name(john).
...

但是,此解决方案也可能会导致错误,因为我们将通过回溯来枚举所有对象,并非所有对象都能理解name/1消息。因此,更好的解决方案是仅枚举了解name/1消息的对象。假设代表一个人的所有对象都直接(或通过继承)实现了person_protocol,我们可以使用conforms_to_protocol/2内置谓词:

| ?- conforms_to_protocol(Person, person_protocol),
     Person::name(john).
...

有关详细信息,请参见https://logtalk.org/manuals/refman/predicates/conforms_to_protocol_2_3.html