digitalmars.D.learn - Calling a method by name.
- Lurker #5 (12/12) Jun 26 2007 One more thing... How can I call a method by name? I was looking at the ...
- Kirk McDonald (25/41) Jun 26 2007 This is typically a feature seen in dynamic languages like Python or
- Derek Parnell (56/69) Jun 26 2007 The names of the methods and functions are 'lost' during the compilation
- Robert Fraser (3/19) Jun 27 2007 http://flectioned.kuehne.cn/
One more thing... How can I call a method by name? I was looking at the
ClassInfo but I cant' find a way to call a method like this:
class Commands
{
void command1() {}
void command2() {}
void command3() {}
}
Commands cmds = new Commands();
char[] cmd = readLine();
call(cmd, cmd);
Any ideas on how to implement this call() method?
Tnks
Jun 26 2007
One more thing... How can I call a method by name? I was looking at the
ClassInfo but I cant' find a way to call a method like this:
class Commands
{
void command1() {}
void command2() {}
void command3() {}
}
Commands cmds = new Commands();
char[] cmd = readLine();
call(cmd, cmd);
Any ideas on how to implement this call() method?
Tnks
This is typically a feature seen in dynamic languages like Python or
Ruby. In D, the names of methods basically just exist at compile-time.
You'll have to implement the dispatch mechanism yourself, perhaps
something like:
void call(Commands c, char[] cmd) {
switch(cmd) {
case "command1":
c.command1();
break;
case "command2":
c.command2();
break;
case "command3":
c.command3();
break;
default:
assert(false, "bad command!");
}
}
--
Kirk McDonald
http://kirkmcdonald.blogspot.com
Pyd: Connecting D and Python
http://pyd.dsource.org
Jun 26 2007
One more thing... How can I call a method by name? I was looking at
the ClassInfo but I cant' find a way to call a method like this:
class Commands
{
void command1() {}
void command2() {}
void command3() {}
}
Commands cmds = new Commands();
char[] cmd = readLine();
call(cmd, cmd);
The names of the methods and functions are 'lost' during the compilation
process, so you might like to set up your own name to function mapping.
Something like this I find useful...
// --------------------
import std.stdio;
// Here are the definition of the known commands.
void command1()
{
}
void command2()
{
}
void command3()
{
}
void function()[string] RMap; // List of commands, mapped by name.
// Call a command.
void call(string cmdname)
{
if (cmdname in RMap)
{
writef("Calling '%s': ", cmdname);
RMap[cmdname]();
}
else
{
throw new Exception("'" ~ cmdname ~ "' is not mapped to a
command.");
}
}
// Initialize the Name -> Command mapping
static this()
{
RMap["One"] = &command1;
RMap["Two"] = &command2;
RMap["Three"] = &command3;
}
void main()
{
// Invoke some commands to test it.
call("Two");
call("One");
call("One");
call("Three");
call("Four"); // Should fail 'cos not mapped
}
// ---------------
--
Derek
(skype: derek.j.parnell)
Melbourne, Australia
27/06/2007 1:40:20 PM
Jun 26 2007
http://flectioned.kuehne.cn/
Check there for info about D's runtime reflection capabilities. I'm not _sure_
if flectioned supports it or not, but I think so.
One more thing... How can I call a method by name? I was looking at the
ClassInfo but I cant' find a way to call a method like this:
class Commands
{
void command1() {}
void command2() {}
void command3() {}
}
Commands cmds = new Commands();
char[] cmd = readLine();
call(cmd, cmd);
Any ideas on how to implement this call() method?
Tnks
Jun 27 2007









Kirk McDonald <kirklin.mcdonald gmail.com> 