宝书课程#1:Ada 2005中的受限类型 --受限集合

宝书课程#1:Ada 2005中的受限类型

--受限集合

by Bob Duff—AdaCore

Translator:Dongfeng.Gu

让我们开始吧

一个Ada我所喜欢的特征是对于集合的“全覆盖规则”。例如,假设我们有一个记录类型:

   type Person is

      record

         Name : Unbounded_String;

         Age : Years;

      end record;

我们可以使用一个集合来创建一个这个类型的对象:

   X : constant Person :=

      (Name => To_Unbounded_String (”John Doe”),

       Age => 25);

全覆盖规则意思是所有的Person的成员必须在集合中记录。如果我们接着通过增加一个成员来修改Person类型:

   type Person is

      record

         Name : Unbounded_String;

         Age : Natural;

         Shoe_Size : Positive;

      end record;

我们忘记修改X,于是编译器将提醒我们。Case语句也同样有全覆盖规则,它提供一个近似的目的。

当然,我们可以通过使用“others”来击败全覆盖规则(通常用于数组集合与情形语句,也偶尔对记录集合有用):

   X : constant Person :=

      (Name => To_Unbounded_String (”John Doe”),

       others => 25);

根据Ada参考手册,“others”这里精确的表示“Age|Shoe_Size”。但那是错误的:“others”真实的含义是“其它所有成员,包含我们可能在下周或下年将添加的成员”。这意味着你不应该使用“others”,除非你非常确信它将适用于所有未创作的情形。

到目前为止,这都是旧新闻了--自从Ada83以来全覆盖规则一直被维护。这和Ada2005有什么关系呢?

假设我们有一个受限类型:

   type Limited_Person is limited

      record

         Self : Limited_Person_Access := Limited_Person'Unchecked_Access;

         Name : Unbounded_String;

         Age : Natural;

         Shoe_Size : Positive;

      end record;

这个类型有一个自引用,它对复制对象没有意义,因为Self将最后指向错误的地方。因此,我们希望使类型受限,来防止程序员意外地创建副本。总之,该类型可能是私有的,因此客户端程序员可能不会意识到这个问题。我们也可以通过受控类型来解决那个问题,但是受控类型是费开销的,并且会增加不必要的复杂度,如果没有必要的话,就不要使用受控类型。

Ada95中,对于受限类型的集合(声明)是非法的。因此,我们将面临一个艰难的选择:创建受限类型对象,并且像这样初始化它:

   X : Limited_Person;

   X.Name := To_Unbounded_String ("John Doe");

   X.Age := 25;

这里有一个全覆盖规则应该防止的维护问题。或许,使类型非受限,这样可以获得集合(声明)的福利,但却失去防止拷贝的能力。

Ada2005中,一个集合(声明)可以用于受限对象。我们可以说:

   X : aliased Limited_Person :=

      (Self => null, – Wrong!

       Name => To_Unbounded_String (”John Doe”),

       Age => 25,

       Shoe_Size => 10);

   X.Self := X'Access;

我们将在未来的宝书课程中看到“Self=>null”做了什么。

一个非常重要的要求需要指出:创建X的值必须现场实现,不可以在一个临时变量中创建一个集合声明,然后复制它到X,因为这将违反受限对象的整个出发点--你不可以复制它们。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统,可以是移动应用、网页服务或集成到智能农业设备。 7. **实时监测**:在实际应用,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值