我想缩短以下代码:
content = content.join("\n") if content.respond_to? :join
进入这个:
content.try!(:join, "\n")
这是一个好主意,是否可以根据现有Object.try
?
答案 0 :(得分:2)
如果我理解正确,您需要一个try
版本来就地修改对象,就像x = x.reverse
和x.reverse!
回答你的问题......
这是个好主意吗
不,不是,实际上是不可能的。
可以用现有的
来实现Object.try
吗?
不,它无论是否有Object.try
,都无法实现。您无法就地更改对象的类型。
在数组上使用.join
会生成一个字符串。您无法就地更改阵列以成为字符串。这就是为什么首先没有join!
方法的原因。 Array和Enumerable上的许多方法都有{和{}}的版本。许多其他方法没有!
版本。这是因为!
版本无法实现。
一般情况下,如果你有一个类似!
的方法,并且它就地等效reverse
,你可以使用reverse!
就好了:
try
如果content.try(:reverse!)
方法已经不存在,例如!
和不存在的join
,那么因为它不起作用,你不能使其与假设的join!
一起使用。
请注意,您可以使用代理对象创建类似这样的工作,但这对于不存在的问题来说是一个可怕的过度解决方案。
只需使用try!
即可完成。