I am creating a Ruby script that basically:
1) Has a prompt that gets a command string (ex. 'edit user1 15')
2) Parses the string
3) Runs specific command (like 'edit' or 'new')
4) Repeats
From a functional level I know how to make this work, but how do I make
it dynamic in the sense that another user could easily add their own
commands by adding a new subclass?
I was thinking something like this:
class Update < Command
...
end
The problem is I don’t know how to dynamically create a new 'Update'
instance if that is the command string (ie 'update user')? I know how to
call a method using 'send' and I guess that would be another approach
maybe, but is there something for classes?
cmd = gets.chomp #ie 'update user'
c = cmd.split(' ')[0].new #simple parsing example
c.run
I am creating a Ruby script that basically:
1) Has a prompt that gets a command string (ex. 'edit user1 15')
2) Parses the string
3) Runs specific command (like 'edit' or 'new')
4) Repeats
From a functional level I know how to make this work, but how do I make
it dynamic in the sense that another user could easily add their own
commands by adding a new subclass?
I was thinking something like this:
class Update < Command
...
end
The problem is I don’t know how to dynamically create a new 'Update'
instance if that is the command string (ie 'update user')? I know how to
call a method using 'send' and I guess that would be another approach
maybe, but is there something for classes?
Classes are objects too. They respond to Object#send.
cmd = gets.chomp #ie 'update user'
c = cmd.split(' ')[0].new #simple parsing example
c.run
I haven't touched that code for years, and it had some issues when I
last worked with it, so I'm not really suggesting you use it, so much
as look at it for ideas of how to do what you want
Ben
···
On Wed, Feb 3, 2010 at 11:10 AM, Kale Davis <kale.davis@gmail.com> wrote:
I am creating a Ruby script that basically:
1) Has a prompt that gets a command string (ex. 'edit user1 15')
2) Parses the string
3) Runs specific command (like 'edit' or 'new')
4) Repeats
From a functional level I know how to make this work, but how do I make
it dynamic in the sense that another user could easily add their own
commands by adding a new subclass?
Hi, not completely sure I understand what you are trying to do, but Robert's
post got me interested, and I wanted to try it out.
This is what I came up with: http://gist.github.com/294520
For that he first needs the class instance. Something like cl = Object.const_get("Update") will do. Then you can do whatever you want to do with it. In this case all classes should probably share a common interface method, e.g.
class Command
def execute(*args)
raise "Not implemented"
end
end
class Update < Command
def execute(*a)
...
end
end
Kind regards
robert
···
On 03.02.2010 20:13, Marnen Laibow-Koser wrote:
Kale Davis wrote:
I am creating a Ruby script that basically:
1) Has a prompt that gets a command string (ex. 'edit user1 15')
2) Parses the string
3) Runs specific command (like 'edit' or 'new')
4) Repeats
From a functional level I know how to make this work, but how do I make
it dynamic in the sense that another user could easily add their own
commands by adding a new subclass?
I was thinking something like this:
class Update < Command
...
end
The problem is I don’t know how to dynamically create a new 'Update'
instance if that is the command string (ie 'update user')? I know how to
call a method using 'send' and I guess that would be another approach
maybe, but is there something for classes?
Classes are objects too. They respond to Object#send.
That's exactly what I had in mind. Thanks for fleshing it out!
Kind regards
robert
···
On 02/04/2010 12:03 PM, Josh Cheek wrote:
[Note: parts of this message were removed to make it a legal post.]
Hi, not completely sure I understand what you are trying to do, but Robert's
post got me interested, and I wanted to try it out.
This is what I came up with: 294520’s gists · GitHub
Hi, not completely sure I understand what you are trying to do, but
Robert's post got me interested, and I wanted to try it out.
This is what I came up with: 294520’s gists · GitHub
module Command
[...]
def self.included( base ) @registered_commands << base
end
And when using a base class instead of a module, one could use the
Class#inherited hook (that's the route Ben Bleything, above, took in
'linen').
cmd_class = class_name.classify.constantize
Better let each command tell us its name, or names. It allows for
several names (aliases) for a command.