对象名称作为 Logtalk 中的变量
Object name as variable in Logtalk
是否可以将对象的名称作为变量获取?我正在尝试创建一个数据库,其中每个对象代表每个人。我有 [name/1, surname/1] 的对象,但是当我问例如
X::name(john).
它给我一个错误。 Ofc用这个方法获取atom是没有问题的:
object_id::name(X).
::/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。
是否可以将对象的名称作为变量获取?我正在尝试创建一个数据库,其中每个对象代表每个人。我有 [name/1, surname/1] 的对象,但是当我问例如
X::name(john).
它给我一个错误。 Ofc用这个方法获取atom是没有问题的:
object_id::name(X).
::/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。