2014-12-22 125 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并完成它。