我正在编写一个小型 Ruby 命令行应用程序,它使用fileutils
来自文件操作的标准库。根据用户调用应用程序的方式,我想包括FileUtils
, FileUtils::DryRun
or FileUtils::Verbose
.
Since include
是私有的,但是我不能将选择的逻辑放入对象的initialize
方法。 (这是我的第一个想法,从那时起我可以将有关用户选择的信息作为参数传递给new
.)我提出了两个似乎有效的选项,但我对此都不满意:
-
根据用户的选择在应用程序的命名空间中设置一个全局变量,然后在类中执行条件包含:
class Worker
case App::OPTION
when "dry-run"
include FileUtils::DryRun
etc.
-
创建子类,唯一的区别是哪个版本FileUtils
他们包括。根据用户的选择,选择合适的一种。
class Worker
include FileUtils
# shared Worker methods go here
end
class Worker::DryRun < Worker
include FileUtils::DryRun
end
class Worker::Verbose < Worker
include FileUtils::Verbose
end
第一种方法似乎很枯燥,但我希望有一些我没有想到的更简单的方法。
那如果是私人的呢?
class Worker
def initialize(verbose=false)
if verbose
(class <<self; include FileUtils::Verbose; end)
else
(class <<self; include FileUtils; end)
end
touch "test"
end
end
这包括FileUtils::something
特别是Worker
的元类 - 不在主类中Worker
班级。不同的工人可以使用不同的FileUtils
这边走。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)