【发布时间】:2012-09-26 22:32:23
【问题描述】:
我致力于构建类结构以实现 cli 脚本。
我想创建类方法来注册命令。
当注册一个命令时,我想为此自动生成一个 getter。
所以,我有这个结构:
lib/my_lib/commands.rb
lib/my_lib/commands/setup_command.rb
然后是文件内容:
# lib/my_lib/commands.rb
method MyLib
method Commands
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def register_command(*opts)
command = opts.size == 0 ? {} : opts.extract_options!
...
end
def register_options(*opts)
options = opts.size == 0 ? {} : opts.extract_options!
...
end
end
class AbstractCommand
def name
...
end
def description
...
end
def run
raise Exception, "Command '#{self.clas.name}' invalid"
end
end
end
end
# lib/my_lib/commands/setup_command.rb
module MyLib
module Commands
class SetupCommand < AbstractCommand
include MyLib::Commands
register_command :name => "setup",
:description => "setup the application"
def run
puts "Yeah, my command is running"
end
end
end
end
我想要的:
# my_cli_script
#!/usr/bin/env ruby
require 'my_lib/commands/setup_command'
command = MyLib::Commands::SetupCommand.new
puts command.name # => "setup"
puts command.description # => "setup the application"
puts command.run # => "Yeah, my command is running"
【问题讨论】:
-
在您的代码中,您的意思是“module MyLib”而不是“method MyLib”吗?此外,可选地,您可能必须放弃学习 Java 才能成为更高效的 Ruby 编码器 :) 我不知道是不是只有我一个人,或者这里有 Javaisms 的味道 :)
标签: ruby class methods class-method