检查对象是不是已经存在?

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检查记录是不是已经存在

休眠,检查对象是不是存在和空值

检查formdata对象键是不是存在

打开“Sheet1$”的行集失败。检查对象是不是存在于数据库中

如何使用 lua 检查 Roblox 中是不是存在对象?