检查对象是不是已经存在?
Posted
技术标签:
【中文标题】检查对象是不是已经存在?【英文标题】:Check if object already exists?检查对象是否已经存在? 【发布时间】:2021-01-18 19:11:56 【问题描述】:我有:
:- use_module(library(logtalk)).
:- buffer.
:- initialization(main).
main :-
create_object(env,[instantiates(buffer)],[],[]),
它可以工作,但每次我重新查阅该文件时都会报错,因为该对象已经存在。
有没有办法检查对象是否已经存在并跳过重新创建它?
更多代码:
:- use_module(library(logtalk)).
:- consult(utils).
%% :- initialization((
%% logtalk_load([buffer,env]).
%% )).
:- buffer.
:- initialization(main).
main :-
%% create_object(env,[instantiates(buffer)],[],[]),
env::set(uid,0), env::set(name,"").
这行得通:
:- initialization((
logtalk_load([buffer])
)).
即没有点也没有“env”
【问题讨论】:
【参考方案1】:您可以使用current_object/1
谓词来检查对象是否存在。但是从您的代码片段看来,您可以简单地在源文件中定义 env
对象。如果您需要 env
成为动态对象(为什么?),请使用 dynamic/0
指令:
:- object(env,
instantiates(buffer)).
:- (dynamic)/0.
:- end_object
顺便说一句,永远不要在源文件中使用***缩写(例如/1
);它们不是语言的一部分。改为写:
:- use_module(library(logtalk)).
:- initialization((
logtalk_load([buffer, env])
)).
附:您正在为 SWI-Prolog 使用 logtalk
包。但是这个包是为了部署,而不是开发,因为它将Logtalk发行版中的所有文件(包括文档)隐藏在用于包的隐藏目录中。
【讨论】:
我在“main”中有其他东西 请注意,您可以在同一个源文件中拥有多个initialization/1
指令。
我在 buffer.lgt 中有 env,但我认为在源文件中会更好。可能你是对的,我在源代码中不需要它,因为它不是动态的
不使用 pack 有什么好处?
buffer 工作其他没有....我在 main 中使用 env以上是关于检查对象是不是已经存在?的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3 iOS10核心数据根据id检查记录是不是已经存在