有时我需要这样的方法,它可以改变自己对象的类。有String#delete!#downcase!#encode!#gsub!#strip!#slice!String等。它们都在尝试更改字符串,但结果类仍然是String。我想要一个方法,可以把Array转换成。
有办法做到这一点:

irb(main):082:0> str = "qwerty"
=> "qwerty"
irb(main):083:0> str.split! "e"
=> ["qw", "rty"]
irb(main):084:0> str
=> ["qw", "rty"]

有可能吗?也许一些酷日本功夫或丑陋的自行车-我想看看任何解决办法。

最佳答案

不,不可能。对象不能在ruby中更改它们的类。
例如,在smalltalk中,可以使用become:

becomeSubStrings: aString
    self become: (self subStrings: aString).

如果你这样称呼它:
s := 'qwerty'.
s becomeSubStrings: 'e'.

现在,s是一个数组:
Transcript show: s printString.

结果是:
#('qw' 'rty')

技术上,become:不会改变对象的类,而是让一个对象变成另一个对象。在这种情况下,我们让self成为self subStrings:的结果,它将字符串分割成一个子字符串数组。结果是一样的:原来的字符串接收器现在是一个数组。

10-04 11:12