Nak*_*lon 3 ruby class self-modifying
有时我需要这样的方法,它可以改变自己对象的类.有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"]
Run Code Online (Sandbox Code Playgroud)
可能吗?也许一些很酷的日本功夫或丑陋的自行车 - 我想看到任何解决方案.
Jör*_*tag 10
不,不可能.对象无法在Ruby中更改其类.
例如,在Smalltalk中,您可以使用become:
:
becomeSubStrings: aString
self become: (self subStrings: aString).
Run Code Online (Sandbox Code Playgroud)
如果你这样称呼它:
s := 'qwerty'.
s becomeSubStrings: 'e'.
Run Code Online (Sandbox Code Playgroud)
现在,s
是一个数组:
Transcript show: s printString.
Run Code Online (Sandbox Code Playgroud)
结果是:
#('qw' 'rty')
Run Code Online (Sandbox Code Playgroud)
从技术上讲,become:
不会更改对象的类,而是让一个对象成为另一个对象.在这种情况下,我们将self
成为结果self subStrings:
,将字符串拆分为子串数组.结果是一样的:原始字符串接收器现在是一个数组.