arrays - 你如何初始化一个只有一个元素的数组,而不用硬编码第一个索引?
问题描述
我正在尝试将 Unbounded_String 数组传递给函数,并且我不关心索引的范围,因为该函数将遍历每个元素。
(element1, element2) 语法自动从范围中的第一个索引值开始,然后为给定的第二个值递增,这对多个值都适用。但是,对于单个值,这不能使用,因为括号被认为是多余的。
此代码显示了我所做的每次尝试的错误消息。(1) 有效,但 (2)(传递单元素数组的首选语法)无效。(3) 有效,并作为这个类似问题的答案给出。但是,这会将范围的第一个索引硬编码到调用方;如果 String_Array 实现发生变化,所有的调用点都必须改变,即使它们不关心所使用的索引值。
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
procedure Main is
function "+"(S: String) return Ada.Strings.Unbounded.Unbounded_String
renames Ada.Strings.Unbounded.To_Unbounded_String;
type String_Array is array (Positive range <>) of Unbounded_String;
procedure Foo(input : in String_Array) is
begin
null;
end Foo;
begin
Foo((+"one", +"two")); --(1)
--Foo((+"only")); --(2) positional aggregate cannot have one component
Foo((1 => +"only")); --(3)
--Foo((String_Array'First => +"only")); --(4) prefix for "First" attribute must be constrained array
--Foo((String_Array'Range => +"only")); --(5) prefix for "Range" attribute must be constrained array
--Foo((String_Array'Range'First => +"only")); --(6) range attribute cannot be used in expression
--Foo((String_Array'Range'Type_Class'First => +"only")); --(7) range attribute cannot be used in expression
end Main;
解决方案
您想要的 (2) 确实是不可能的,因为它可能被误认为是带括号的表达式(参见http://www.adaic.org/resources/add_content/standards/12aarm/html/AA-4-3-3.html note 10)。
如果您出于上述原因确实想避免使用表达式 (3),作为解决方法,您可以定义一个函数来处理单元素数组的情况:
function Singleton_String_Array (S: String) return String_Array is ((1 => + S));
-- one element call
Foo(Singleton_String_Array ("only"));
它重用您的表达式 (3),但第一个索引硬编码不再在呼叫站点上完成。
您还可以重载 foo 函数来处理特殊的单元素情况:
procedure Process_String (input : in Ada.Strings.Unbounded.Unbounded_String) is
begin
null;
end Process_String;
procedure Foo(input : in String_Array) is
begin
for string of input loop
Process_String (string);
end loop;
end Foo;
procedure Foo(input : in Ada.Strings.Unbounded.Unbounded_String) is
begin
Process_String (input);
end Foo;
-- One element call
Foo(+"only");
推荐阅读
- jquery - jquery 过滤器:多个条件和操作
- ios - 如何访问结构内的 var 以计算 var 数组中列出的项目数?
- php - 提交时,不重定向到操作页面 PHP
- cordova - Android 29 中的内核-ranchu
- php - 网站的每个用户是否共享相同的变量,或者每个用户都是唯一的(即使他们的名称相同)
- objective-c - Objective C (iOS):即使视图发生变化,如何保留变量值?
- javascript - 降低矩阵排序的运行时复杂性
- cakephp-3.x - Cakephp 包管理器(安装程序设置,如 wordpress 和 joomla)框架
- reactjs - 如何更改语义 UI 反应中的背景颜色?
- python - 如何替换所有带连字符的单词