2014-11-14 24 views
1

我的任務是爲編碼挑戰創建一個無與倫比的tic tac toe對手,並且我想創建一個Ruby寶石這樣做,它具有適當的測試覆蓋率和體面的面向對象設計(OOD)。在Ruby中,使用「def initialize(value ='')」初始化類實例有什麼好處

雖從未在我自己的寶石,並且是適當的OOD原則,新的學生,我找到了一個很好的博客文章,通過走正是我需要的:http://codequizzes.wordpress.com/2013/10/25/creating-a-tic-tac-toe-game-with-ruby/

在定義Cell類,下面的代碼給出一個例子:

module TicTacToe 
    class Cell 
    attr_accessor :value 

    def initialize (value = "") 
     @value = value 
    end 

    end 
end 

在我看來,雖然,鑑於此初始化的簡單,我們可以很容易地做到這一點:

module TicTacToe 
    class Cell 
    attr_accessor :value 

    def initialize 
     @value = "" 
    end 

    end 
end 

那麼以第一種方式完成第一種方法的理由是什麼?

編輯

好吧,我現在感覺有點傻;閱讀博客文章有點接近,上面清清楚楚地寫着

Cell類上纏繞有井字模塊遵循紅寶石寶石公約和防止>類名稱衝突時寶石都包含在其他項目。 如果Cell初始化時沒有任何參數,那麼單元格的值將是空字符串,但Cell也可以用參數進行初始化。實例化單元后,其值不能更新。

不過,我仍然困惑的最後一句話,「細胞被實例化,它的價值不能被更新後。」

我認爲在這個例子中不正確,因爲我的理解,在attr_accessor方法使價值可讀可寫的 - 因爲它是可寫的,我不能說

move = Cell.new 
move.value = X 
更新
+1

第一種方式讓'「」''爲在value'默認值,所以'值=>「 「'Cell.new',但'value =>」cat「'for Cell.new(」cat「)'。 – 2014-11-14 17:35:39

回答

3

第一種情況:

def initialize (value = "") 
    @value = value 
end 

將設置@value如果沒有參數傳遞給初始化爲空字符串。如果傳遞一個參數來初始化,則值將被設置爲該參數。

第二種情況:

def initialize 
    @value = "" 
end 

將始終設置@value爲空字符串,並且不會接受的參數。

例子:

如果我們有

module TicTacToe 
    class Cell 
    attr_accessor :value 
    def initialize (value = "") 
     @value = value 
    end 
    end 
end 

c = TicTacToe::Cell.new("hello") 
puts c.value 

代碼將打印打招呼。

使用相同的代碼之上,但最後兩行更改爲

c = TicTacToe::Cell.new 
puts c.value  

的代碼打印什麼(當然除了空字符串)。

現在,如果我們我們的代碼更改爲第二種方式:

module TicTacToe 
    class Cell 
    attr_accessor :value 
    def initialize 
     @value = "" 
    end 
    end 
end 

c = TicTacToe::Cell.new 
puts c.value 

這將再次輸出空字符串。然而,這個時候如果我們試圖在最後兩行更改爲:

c = TicTacToe::Cell.new("hello") 
puts c.value 

我們得到了一個錯誤,因爲初始化不是在等一個說法。因此,除了空字符串之外,我們不能用任何@value實例化它。

在問候你的編輯:

是的,你仍然可以改變@value。如果你想避免這種情況,使之只可讀改變

attr_accessor :value 

attr_reader :value 
0

這個網站實際上做explaiing這樣你們兩個以上所指定的方式的利弊的一個不錯的工作:http://www.rubyist.net/~slagell/ruby/objinitialization.html

爲了您的第一個例子中,在通過「價值」爲「」作爲一個參數允許你覆蓋這個默認值,而你的第二個例子強制無論條件如何變化,'@value'變量總是「」。

讓我知道這是否有幫助。

+1

非現場鏈接對SO來說不是很好的答案。鏈接可能會中斷或更改。您能否將相關文章的相關摘錄複製到您的答案中? – Jeff 2014-11-14 17:39:54

+1

有趣的鏈接...這裏是相關的信息: 「靈活的初始化 ...如果給出它可以使用參數,否則回退到默認值。」 – 2014-11-14 19:29:29

+1

@Jeff - 感謝您對此答案的反饋。展望未來,我將爲上下文提供鏈接,但也會對無法鏈接的問題提供更有力的迴應。鑑於已經接受的答案已經由另一個用戶提供,並且與我所提出的觀點相一致,我將保留原樣。感謝您的反饋! – 2014-11-14 19:49:10

相關問題