【问题标题】: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”

【问题讨论】:

    标签: object prolog exists logtalk


    【解决方案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
    猜你喜欢
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 2017-02-24
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 2012-05-13
    相关资源
    最近更新 更多