3

独自のオブジェクトのクラスを変更できるようなメソッドが必要になることがあります。、、、、、、などがあります。それらはすべて文字列を変更しようとしていますがString#delete!、結果のクラスはとにかくまだです。そして、に変換できるメソッドが必要です。これを行ういくつかの方法:#downcase!#encode!#gsub!#strip!#slice!StringStringArray

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

出来ますか?クールな日本のカンフーか醜い自転車かもしれません — 何か解決策を見たいです.

4

3 に答える 3

11

いいえ、できません。オブジェクトは 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:結果は同じです。元の文字列レシーバーは配列になります。

于 2010-09-25T05:33:57.033 に答える
0

Jörg W Mittag の答えは確かです。オブジェクトのクラスを変更できないのは、言語としての Ruby の基本的な属性です。

あなたができる最善のことは、あなたがすでに行っていると確信しているので、変数を再割り当てすることです:

irb(main):082:0> str = "qwerty"
=> "qwerty"
irb(main):083:0> str = str.split "e"
=> ["qw", "rty"]
irb(main):084:0> str
=> ["qw", "rty"]
于 2010-09-29T06:02:37.357 に答える
0

これは、 evil-rubyを使用する場合にのみ可能です (少なくとも、evil-ruby がこれをサポートしていると確信しています)。これは、Ruby に意図されていないことを実行させる非常に巧妙なハックですが、それを使用する Ruby コードで実際のセグメンテーション違反を引き起こすことが知られている移植性のないハックでもあります。本番コードでは絶対に使用しないでください。

それ以外の場合は、文字列に内部配列を与え、すべてのメッセージを配列に委譲させます ( BlankSlate + Forwardableの行に沿って)。

やりたいことはまだない。そのような些細な利便性が実装のハックさを上回る状況は想像できません。

于 2010-09-29T06:24:42.607 に答える