在from itertools import product
sorted([(k1, k2, v1+v2) for (k1, v1), (k2, v2) in product(dict1.items(), dict2.items())], \
key = lambda x: x[2], reverse=True)
# [('Main', 'Global', 16),
# ('Optional', 'Global', 14),
# ('Obscure', 'Global', 12),
# ('Main', 'Regional', 12),
# ('Main', 'Local', 10),
# ('Optional', 'Regional', 10),
# ('Obscure', 'Regional', 8),
# ('Optional', 'Local', 8),
# ('Obscure', 'Local', 6)]
中我指定了两个参数(大小和类型)。我想创建一个具有用户在Stack.adb
文件中指定的确切数据类型的堆栈。
我似乎找不到使用用户定义的堆栈类型变量创建新包或实例化堆栈的方法。在我继续之前,代码在下面(为了避免代码墙,我已经取出了一些不相关的行):
multistack.adb
:
Stack.adb
GENERIC
SIZE : Integer; --size of stack
TYPE Item IS PRIVATE; --type of stack
:
multistack.adb
因此,正如您可以通过代码告诉我已经为Stack类型创建了数据类型。我还创建了一个WITH Ada.Text_Io; USE Ada.Text_Io;
WITH Stack;
PROCEDURE multistack IS
PACKAGE Iio IS NEW Ada.Text_Io.Integer_Io(Integer); USE Iio;
Type StackType IS (Int, Str, Char, Day);
package stack_io is new Ada.Text_IO.Enumeration_IO(StackType); use stack_io;
package get_user_specs is
function makestack return StackType;
end get_user_specs;
package body get_user_specs is
function makestack return StackType is
s_type : StackType;
begin
put("What is the stack type?"); new_line;
get(s_type);
return s_type;
end makestack;
begin
null;
end get_user_specs;
user_stack_type : StackType := get_user_specs.makestack;
PACKAGE User_Stack IS NEW Stack(100, user_stack_type); use User_Stack;
BEGIN
null;
END Multistack;
包来获取用户输入。我遇到的具体问题是:
Enumeration_IO
我正在抱怨我试图使用 PACKAGE User_Stack IS NEW Stack(100, user_stack_type); use User_Stack;
作为类型。具体错误为user_stack_type
,然后表示User_Stack未定义。
我做了expect valid subtype mark to instantiate "Item"
只是为了测试,我可以确认它确实获得了用户指定的数据类型。那么为什么不允许我创建这个包User_Stack?
答案 0 :(得分:8)
在您的片段中,user_stack_type
是object declaration,但generic instantiation需要subtype mark。获得所需效果的一种方法是在已知所选子类型后,在嵌套范围内实例化泛型:
if User_Stack_Type = Int then
declare
package User_Stack is new Stack(100, Integer);
begin
Put_Line(Stack_Type'Image(User_Stack_Type));
…
end;
end if;