2015-07-03 75 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

謝謝!我最終使用了更多的這種方法,在那裏我通過全局狀態來初始化並在稍後處理它。 –