我有一个课程,我试图根据创建输入确定输出。
class MyCommand
attr_accessor :command
def initialize(command = nil)
@command = command
end
# @return Boolean
def global?
@command.start_with?('--global')
end
end
这样就可以了:
foo = MyCommand.new('hello')
foo.command #=> "hello"
foo.global? #=> false
然而,当我通过我的条件时,我会得到一些好的,一些不那么好的结果:
bar = MyCommand.new('--global world')
bar.global? #=> true
bar.command #=> "--global world"
即command
包含我的条件。
我已尝试创建另一种方法从任何拥有它的命令中分出--global
,但后来得到的结果略有不同:
bar.command = 'world'
bar.command #=> "world"
bar.global? #=> false
但这会改变bar
的当前状态。
我怎样才能使这个类和方法运行,以便即使在命令改变后global?
标志仍然存在?
更好的是,我是否可以仅在global?
方法中实施所有更改 - 从而最大限度地减少我对整体课程变更的影响?
答案 0 :(得分:0)
在initialize
期间,您可以在设置--global
时删除@command
,然后将@global
分配为true或false,然后编辑@global?
以返回值:
class MyCommand
attr_accessor :command
def initialize(command = '')
@command = command.gsub('--global ','')
@global = command.start_with?('--global') ? true : false
end
# @return Boolean
def global?
@global
end
end
请注意,gsub
将删除' - global'无论是在command
的开始,中间还是结尾,并且假设它总是跟着一个尾随空格,所以如果你不确定你的输入,你就需要一些东西处理command
会更加健壮。
P.S。刚刚意识到如果command
为nil
,这将无效,因此将默认设置更改为空字符串。如果你真的需要它nil
,那么将需要一些额外的检查(但不幸的是我现在必须注销)。