2015-07-03 73 views
1

我有我试图确定的基础上创造的输入输出类。覆盖的实例属性有条件

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包括我的情况。

我试图创建另一个方法SUB OUT从具有任何命令--global,但后来我得到略有不同的结果:

bar.command = 'world' 
bar.command #=> "world" 
bar.global? #=> false 

但是,这会产生变异的bar当前状态。

我怎么可能去让这个类和方法的行为,这样的命令改变之后也global?标志保持?

更妙的是,我能实现所有的只有global?方法中的变化 - 从而最大限度地减少我对整个班级变化的影响?

+0

你想'@ command'是'--global world'但是当你调用'barr.command'或做你真正想要'@ command'是'world'当输入为''返回world' - 全球化世界? – Joseph

+0

@Joseph我想,我想'bar.command'返回'world',但对于'bar.global?'返回TRUE;。 –

回答

0

initialize,你可以设置@command时去掉--global,你可以指定@global真或假,然后编辑@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'无论是在begginning,中间或结束command,它是假设它总是后跟一个尾部空间,因此,如果你不知道你的输入你需要的东西更稳健一点过程command

P.S.刚刚意识到这不会工作,如果commandnil,所以更改默认为空字符串。如果你真的需要它是nil,一些额外的检查将是必需的(但不幸的是我现在要注销)。

+0

谢谢!我最终使用了更多的这种方法,在那里我通过全局状态来初始化并在稍后处理它。 –