ada - 使用“使用”。它不仅仅消除了对前缀的需求吗?
问题描述
以下程序 (main.adb) 将无法编译,并给出错误:
main.adb:10:15: expected private type "ThreadName" defined at config.ads:5
main.adb:10:15: found private type "Ada.Strings.Unbounded.Unbounded_String"
main.adb:11:45: expected private type "Ada.Strings.Unbounded.Unbounded_String"
main.adb:11:45: found private type "ThreadName" defined at config.ads:5
然而,当我添加“使用配置”时 子句并删除配置。main.adb 中 MyName 声明的前缀,它可以干净地编译并正常工作。我已经理解使用“use”子句只是为了让我避免使用名称空间前缀,但它似乎可以做更多的事情。谁能解释一下?
文件 config.ads 包含
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
package Config is
type ThreadName is new Unbounded_String;
end Config;
我的 main.adb 包含:
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
with Config;
procedure Main is
MyName : Config.ThreadName;
begin
MyName := To_Unbounded_String ("Chris");
Put_Line ( "The name is: " & To_String (MyName));
end Main;
解决方案
使用还使对包中定义的类型的隐式定义操作可见......在此示例中包括 To_Unbounded_String ,反之亦然。
还有 Use Type 使操作可见,而不会用包中的所有内容污染命名空间;但它只暴露了运算符(+、-、= 等),而
with Config;
use all type Config.Threadname;
将使类型、运算符和其他子程序可见,Config.Threadname
而不暴露包中的任何其他内容。
推荐阅读
- swift - swift tvOS 垂直滚动网格
- javascript - 如何查找二维数组中两个坐标之间的所有元素
- android-viewmodel - 使用数据绑定时如何在viewModel.class中获取小部件的值(numberpick)
- wordpress-theming - 木材/树枝 + ACF - Wordpress
- wordpress - WordPress 端点插件显示 SyntaxError: JSON.parse
- reactjs - TypeError:未定义不是对象(评估'_ref.painLevelColor')
- numpy - 我可以使用 simpleaudio(或任何其他非 Windows 相关库)而不是 pyaudio 将流对象转换为 numpy 音频数据吗?
- reactjs - 向“值”添加类型时出现意外标记
- java - 用Java展示GCD的全过程
- java - Spring Security 中的 AntMatcher 阻止了我的授权