是否可以通过Ada的String变量通过其名称来调用过程,就像Python那样:
def _ssh(hostname, port):
pass
def _telnet(hostname, port):
pass
def _mosh(hostname, port):
pass
protocols = {
'ssh': _ssh,
'mosh': _mosh,
'telnet': _telnet
}
# call your function by string
hostname = 'localhost'
port = '22'
protocol = 'ssh'
result = protocols[protocol](hostname, port)
答案 0 :(得分:6)
好吧,这有点麻烦,因为您没有用于创建地图的方便快捷方式(又称字典)。这样就可以了:
with Ada.Containers.Indefinite_Ordered_Maps;
with Ada.Text_IO; use Ada.Text_IO;
procedure Alubio is
我们需要一个指向子程序的指针来实例化Map
type Handler is access procedure (Hostname : String; Port : Integer);
从字符串到子程序指针的映射。它必须是“不确定的”,因为字符串类型是不确定的(不是固定大小),而它必须是“有序的”,因为我们不想麻烦声明哈希函数等。
package Maps is new Ada.Containers.Indefinite_Ordered_Maps
(Key_Type => String,
Element_Type => Handler);
我喜欢在定义子程序之前先声明它们,但是在这里并不一定要
procedure Ssh (Hostname : String; Port : Integer);
procedure Mosh (Hostname : String; Port : Integer);
procedure Telnet (Hostname : String; Port : Integer);
地图
Map : Maps.Map;
演示子程序
procedure Ssh (Hostname : String; Port : Integer) is
begin
Put_Line ("ssh, " & Hostname & Port'Image);
end Ssh;
procedure Mosh (Hostname : String; Port : Integer) is
begin
Put_Line ("mosh, " & Hostname & Port'Image);
end Mosh;
procedure Telnet (Hostname : String; Port : Integer) is
begin
Put_Line ("telnet, " & Hostname & Port'Image);
end Telnet;
begin
设置地图
Map.Insert ("ssh", Ssh'Access);
Map.Insert ("mosh", Mosh'Access);
Map.Insert ("telnet", Telnet'Access);
通过Map调用子程序。不太确定为什么需要.all
(引用指向子程序的指针),您通常不需要:在没有它的情况下,编译器会指出“无效的过程或条目调用”,指向{{1} }。
Map
输出:
Map ("ssh").all ("s", 1);
Map ("mosh").all ("m", 2);
Map ("telnet").all ("t", 3);
end Alubio;
答案 1 :(得分:4)
一种简单的方法是使用枚举类型和case语句。
type Protocol is (ssh, mosh, telnet);
然后使用变量given_protocol : Protocol
:
case given_protocol is
when ssh => Ssh (Hostname, Port);
when mosh => Mosh (Hostname, Port);
when telnet => Telnet (Hostname, Port);
end case;
这可以避免访问类型和地图。
您可以使用given_protocol
属性'Value
从字符串中获得given_protocol := Protocol'Value (given_string)
。
答案 2 :(得分:1)
据我所知,这是不可能的,因为Ada不会像Python那样在哈希图中存储函数和过程。 您仍然可以提供一个函数,将字符串作为参数,然后返回对该函数的访问,然后可以调用该函数,但是我不确定这就是您要尝试的操作。