通过字符串调用函数

时间:2019-02-14 15:48:56

标签: ada

是否可以通过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)

3 个答案:

答案 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那样在哈希图中存储函数和过程。 您仍然可以提供一个函数,将字符串作为参数,然后返回对该函数的访问,然后可以调用该函数,但是我不确定这就是您要尝试的操作。