Ada中重载子程序的疑问:返回类型能否区分重载函数?
Ada中基于返回类型的函数重载:如何区分调用?
Ada确实允许仅通过返回类型差异来重载函数,这和很多主流语言(比如C++)的规则不一样,核心是编译器会通过调用上下文的类型需求来确定要调用哪个版本,具体分几种常见场景:
赋值给明确类型的变量
这是最直观的情况,当你把函数调用的结果赋值给一个已经声明好类型的变量时,编译器会自动匹配返回类型对应的函数版本:-- 声明不同类型的变量 Int_Val : Integer; Float_Val : Float; -- 赋值时自动匹配对应版本 Int_Val := Func(10); -- 调用返回Integer的Func Float_Val := Func(10); -- 调用返回Float的Func作为表达式的一部分参与运算
如果函数调用是某个需要特定类型的表达式的组成部分,编译器会根据表达式的类型要求推断:-- 假设有个接受Float参数的函数Calculate_Avg Avg : Float := Calculate_Avg(Func(20)); -- 这里必须用返回Float的Func版本显式指定返回类型(限定表达式)
如果上下文不够清晰,或者你想强制指定某个版本,可以用Ada的限定表达式语法,直接明确要求的返回类型:-- 强制调用返回Integer的版本 Result := Integer'(Func(30));
需要注意的是,如果调用函数时没有任何类型上下文(比如单独写一行Func(40);却不使用返回值),编译器会直接报错,因为它没办法判断你要调用哪个版本——毕竟这种情况下返回值被丢弃,没有任何线索能确定返回类型。
内容的提问来源于stack exchange,提问作者Elco
相关产品推荐
相关产品推荐

