2014-12-22 206 views
-3

我想縮短,如下面的代碼:如何實現Object.try!在Ruby on Rails中?

content = content.join("\n") if content.respond_to? :join 

到這一點:

content.try!(:join, "\n") 

這是一個好主意,它可以在現有Object.try方面來實現?

+1

如果你想拋出一個異常時,它失敗了,怎麼樣'content.join「\ n」'?... –

+0

您還沒有解釋什麼'試試!'呢。我們應該如何告訴你這是個好主意還是如何實施? – meagar

+0

@BradWerth我不認爲意圖是拋出一個異常... – meagar

回答

2

如果我理解正確的話,你想有一個版本的try修飾就地的對象,如x = x.reversex.reverse!

之間的差異要回答你的問題......

這是一個好主意

不,這不是,它實際上是不可能的。

它可以用現有的Object.try來實現嗎?

不,無論有沒有Object.try,都根本無法實現。你不能就地改變對象的類型。使用.join在數組上產生一個字符串。您不能將數組就地更改爲字符串。這就是爲什麼首先沒有join!方法的原因。 Array和Enumerable上的許多方法的版本有和沒有!。許多其他方法沒有!版本。這是因爲!版本無法實現。

一般來說,如果你有一個像reverse的方法,它是就地相當於reverse!你已經可以使用try就好:

content.try(:reverse!) 

如果!方法已經不存在,如join和不存在的join!,這是因爲它不能工作,並且不能使它與假設的try!一起工作。


注意,你可以做的東西像代理對象這項工作,但是這是一個可怕的過度緊張的解決方案,不存在問題。

只需使用content = content.join("\n") if content並完成它。