如何实现Object.try!在Ruby on Rails中?

时间:2014-12-22 05:42:51

标签: ruby-on-rails ruby

我想缩短以下代码:

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

进入这个:

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

这是一个好主意,是否可以根据现有Object.try

实施

1 个答案:

答案 0 :(得分:2)

如果我理解正确,您需要一个try版本来就地修改对象,就像x = x.reversex.reverse!

之间的区别一样

回答你的问题......

  

这是个好主意吗

不,不是,实际上是不可能的。

  

可以用现有的Object.try吗?

来实现

不,它无论是否有Object.try,都无法实现。您无法就地更改对象的类型。

在数组上使用.join会生成一个字符串。您无法就地更改阵列以成为字符串。这就是为什么首先没有join!方法的原因。 Array和Enumerable上的许多方法都有{和{}}的版本。许多其他方法没有!版本。这是因为!版本无法实现。

一般情况下,如果你有一个类似!的方法,并且它就地等效reverse,你可以使用reverse!就好了:

try

如果content.try(:reverse!) 方法已经不存在,例如!和不存在的join,那么因为它不起作用,你不能使其与假设的join!一起使用。


请注意,您可以使用代理对象创建类似这样的工作,但这对于不存在的问题来说是一个可怕的过度解决方案。

只需使用try!即可完成。