【问题标题】:Can't return each element from a set when running it through a for all loop通过 for all 循环运行集合时无法返回集合中的每个元素
【发布时间】:2019-10-28 22:20:32
【问题描述】:

我试图通过 for all 循环运行包含 Brewage 对象的集合中的每个元素。但是当我尝试这样做时,返回值会变得混乱。

循环函数:

public pure Scan: set of Brewage ==> Brewage
Scan(brewage) == 
for all q in set brewage do 
return q

Brewage 构造函数:

public StringType = seq of char;
public StringLabel = seq of char;
public Char = char; 

instance variables
type : StringType;
label : StringLabel;
deposit : Char;

operations

public Brewage: StringType * StringLabel * Char  ==> Brewage
Brewage(ty, la, de) ==
(   type    := ty;
    label   := la;
    deposit := de
);

我得到的错误是在扫描功能中,如下:

操作返回 void 值。实际:(() | Brewage) 预期:Brewage

【问题讨论】:

    标签: vdm++ vdm-sl


    【解决方案1】:

    您可以使用 let 绑定来选择集合中的 Brewage,然后将其返回:

    public pure Scan: set of Brewage ==> Brewage
    Scan(brewage) == let b in set brewage in return b;
    
    public main: ()==>Brewage
    main()==
    (
      let s = { new Brewage(), new Brewage() } in
        return Scan(s); 
    );
    

    【讨论】:

    • 我无法从集合中返回每个元素。当我运行测试时,它只返回第一个元素。
    • 您的意思是要连续调用 Scan 以返回一个 Brewage 实例?每个调用要么必须返回一个,要么可能返回一个子集或子序列。如果您希望连续调用返回单个项目,则必须保持某种状态来说明哪些值已经返回。
    • (顺便说一下,你会得到那个错误,因为如果传递的对象集是空的,for循环将通过并且操作返回“void”)
    • 好的。因此,如果我想使用 for all 循环,那么我首先需要检查集合是否为非空。
    • 或者如果我想使用 for all 循环应该如何处理?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 2016-06-19
    • 2013-01-06
    相关资源
    最近更新 更多