使用 return 函数值在通用包体中初始化变量
Variable initialization in generic package body using return value of function
在 Ada 中,我有以下规范文件:
GENERIC
TYPE Item IS PRIVATE; --type of array
size : integer; --size of array
PACKAGE gwar IS
function get_size return integer;
END gwar;
和正文文件:
with Ada.Text_Io;
use Ada.Text_Io;
package body gwar is
--Get_Size allows the txt file to specify how much space to allocate.
function get_size return Integer is
Filename : String := "win.txt";
File : Ada.Text_IO.File_Type;
Line_Count : Integer := 0;
ReturnSize : Integer;
begin
Ada.Text_IO.Open(File => File,
Mode => Ada.Text_IO.In_File,
Name => Filename);
while Line_Count /= 1 loop
declare
Line : String := Ada.Text_IO.Get_Line(File);
begin
ReturnSize := Integer'Value(Line);
Line_Count := 1;
end;
end loop;
Ada.Text_IO.Close (File);
return ReturnSize;
end get_size;
begin
null;
end gear;
我想做的是将 size
整数设置为 get_size
返回的值。我怎样才能做到这一点?我曾尝试将我的函数放在规范文件中的 size
变量之前,但它预期文件结束。我尝试设置 size : integer := gwar.get_size
,但这也不起作用。这可能吗?
发送后,代码看起来很奇怪。以下是对各种不一致之处的快速回顾:
两个形式参数Item
和Size
在包的实现中没有使用。很可能您在这里不需要通用包。 Get_Size
是一个函数,不需要将信息存储在任何地方(尽管在另一个包中的调用者当然可能希望将其存储在局部变量中)。尽可能使用没有副作用的函数
在 Get_Size
中,您有一个只会执行一次的循环,因为 Line_Count
始终设置为 1。有更好的函数来计算文件的大小。例如,如果您需要计算行数,请考虑使用 GNATCOLL.Mmap
一次读取内存中的整个文件。这样会更快。
您可能应该处理异常,例如文件在磁盘上不存在或不可读的情况。
最好在规范中包含 Get_Size
的文档,而不是在正文中,以便包的用户可以看到该文档。如果您正在使用 GPS 编辑器,它将在所有对 Get_Size
的引用上显示工具提示,这些工具提示包括文档
如果您只想确定文件的大小,您应该查看包 Ada.Directories。这个包的文档可以在 Ada 语言参考手册的 A.16 部分找到。如果您使用的是 GPS 开发环境,您可以通过帮助菜单访问 Ada 语言参考手册。
Ada.Directories 软件包包含大量用于操作和理解文件的函数和过程。例如,函数 Exists 将文件名作为参数,returns 是一个布尔值,指示命名文件是否存在。还有一个函数 Size,它将文件名作为参数,returns 文件的大小。
在尝试确定文件大小之前检查文件是否存在是有意义的。
最好考虑 的评论,我想,您仍然可以在技术上遵循 Simon Wright 的建议。我做了一些遗漏,专注于如何在泛型本身中为泛型参数赋值。
GENERIC
TYPE Item IS PRIVATE; --type of array
size : in out integer; --size of array
PACKAGE gwar IS
function get_size return integer;
END gwar;
with Ada.Text_Io;
use Ada.Text_Io;
package body gwar is
function get_size return Integer is
ReturnSize : Integer;
begin
ReturnSize := Integer'Value("2");
return ReturnSize;
end get_size;
begin
Size := Get_Size;
end gwar;
这样,当你实例化泛型时,实例体的作用是将参数size
设置为值2
,前提是get_size
returns没有错误。
在 Ada 中,我有以下规范文件:
GENERIC
TYPE Item IS PRIVATE; --type of array
size : integer; --size of array
PACKAGE gwar IS
function get_size return integer;
END gwar;
和正文文件:
with Ada.Text_Io;
use Ada.Text_Io;
package body gwar is
--Get_Size allows the txt file to specify how much space to allocate.
function get_size return Integer is
Filename : String := "win.txt";
File : Ada.Text_IO.File_Type;
Line_Count : Integer := 0;
ReturnSize : Integer;
begin
Ada.Text_IO.Open(File => File,
Mode => Ada.Text_IO.In_File,
Name => Filename);
while Line_Count /= 1 loop
declare
Line : String := Ada.Text_IO.Get_Line(File);
begin
ReturnSize := Integer'Value(Line);
Line_Count := 1;
end;
end loop;
Ada.Text_IO.Close (File);
return ReturnSize;
end get_size;
begin
null;
end gear;
我想做的是将 size
整数设置为 get_size
返回的值。我怎样才能做到这一点?我曾尝试将我的函数放在规范文件中的 size
变量之前,但它预期文件结束。我尝试设置 size : integer := gwar.get_size
,但这也不起作用。这可能吗?
发送后,代码看起来很奇怪。以下是对各种不一致之处的快速回顾:
两个形式参数
Item
和Size
在包的实现中没有使用。很可能您在这里不需要通用包。Get_Size
是一个函数,不需要将信息存储在任何地方(尽管在另一个包中的调用者当然可能希望将其存储在局部变量中)。尽可能使用没有副作用的函数在
Get_Size
中,您有一个只会执行一次的循环,因为Line_Count
始终设置为 1。有更好的函数来计算文件的大小。例如,如果您需要计算行数,请考虑使用GNATCOLL.Mmap
一次读取内存中的整个文件。这样会更快。您可能应该处理异常,例如文件在磁盘上不存在或不可读的情况。
最好在规范中包含
Get_Size
的文档,而不是在正文中,以便包的用户可以看到该文档。如果您正在使用 GPS 编辑器,它将在所有对Get_Size
的引用上显示工具提示,这些工具提示包括文档
如果您只想确定文件的大小,您应该查看包 Ada.Directories。这个包的文档可以在 Ada 语言参考手册的 A.16 部分找到。如果您使用的是 GPS 开发环境,您可以通过帮助菜单访问 Ada 语言参考手册。
Ada.Directories 软件包包含大量用于操作和理解文件的函数和过程。例如,函数 Exists 将文件名作为参数,returns 是一个布尔值,指示命名文件是否存在。还有一个函数 Size,它将文件名作为参数,returns 文件的大小。
在尝试确定文件大小之前检查文件是否存在是有意义的。
最好考虑
GENERIC
TYPE Item IS PRIVATE; --type of array
size : in out integer; --size of array
PACKAGE gwar IS
function get_size return integer;
END gwar;
with Ada.Text_Io;
use Ada.Text_Io;
package body gwar is
function get_size return Integer is
ReturnSize : Integer;
begin
ReturnSize := Integer'Value("2");
return ReturnSize;
end get_size;
begin
Size := Get_Size;
end gwar;
这样,当你实例化泛型时,实例体的作用是将参数size
设置为值2
,前提是get_size
returns没有错误。