我have a class它公開了一個字符串值和一個int值(分別爲一個指令輸出並退出代碼)實現to_int和to_str的。除了通過to_s
和to_i
揭露他們,我還使用to_str
和to_int
,像這樣:後果在紅寶石
class Status
def to_s
@output
end
alias :to_str :to_s
def to_i
@status.exitstatus
end
alias :to_int :to_i
end
我這背後的想法是能夠在儘可能多的情況下,儘可能使用這個對象。讓它可以被一個字符串或int強制增加可用性。舉例來說,我可以用字符串拼接對象:
a_string = "Output was: " + results
(我想用這個作爲INT脅迫,但Fixnum對象的例子+不喜歡它,所以它實際上並沒有正常工作: )
an_int = 1 + results
一切到目前爲止我讀過曾表示,這可能是一個「壞」的事情。常見主題如下所示:「只有當對象基本上是一個字符串/ int」時,才能將對象表示爲字符串/ int,但使用to_s
/to_i
。
毫無疑問,我的課不是「根本」的字符串或int。然而, 我有這個規則的一些問題:
- 它使我的班較不靈活/可用。例如:如果我沒有Status.to_str,我不能使用String。+連接Status輸出和另一個字符串。
- 這似乎違反了鴨子打字的精神。一個對象(即:即得到它作爲一個參數的方法)的用戶不應該關心什麼對象爲,它應該只關心什麼可以做。 (在這種情況下,「做」是指「可被表示爲一個串/ INT」。)
- 爲參數「基本上是一個串/ INT」是相當模糊我。例如,您會看到
Float.to_int
被提及很多。故事情節是,由於浮點數始終有一個整數部分,所以to_int
是一個有效的方法。然而,我認爲這是虛假的:浮點數是而不是整數(因爲它有一個非整數部分),所以試圖將它們的「類型」等同起來沒有多大意義。你可以合法地轉換一個浮點整數(通過截斷),但我可以說,我可以我的狀態轉換爲整數,以及(通過「截斷」的所有非出口的代碼信息)。
所以,我的問題是:有沒有真正的(即:實際)實施to_str
和to_int
危害?
更新:JörgW Mittag給了我一個讓我想到什麼的例子。重新表述的問題是:是否真的需要有to_str
/to_int
當你已經有to_s
/to_i
? (除了特定方法已經預期to_str
超過to_s
的事實)
例如,在Jörg的陣列中。連接示例,數組成員通過to_s轉換,而分隔符通過to_str轉換。但這真的有必要嗎?如果Array.join改爲調用separator.to_s,那麼您可以成功傳遞更多的對象(例如:整數,符號等)並獲得更大的靈活性。 Ruby是否受益於這種分離?
我在實際的代碼中做了這些(請參閱鏈接的類),但爲了簡潔起見,我在這裏發佈的示例代碼中省略了這些方法。 – 2009-11-11 21:29:18