2017-09-22 11 views
1

なぜマップ!分割された文字列で動作しませんか?マップで分割!動作しません

str = "abcd" 
str.split('').map! { |x| x + "!" } 
str # => "abcd" 

私は、これは新しい配列を返すstr.split('')["a!","b!","c!","d!"]

+0

を使用することができますか? 'map!' pingの配列への参照は決して割り当てられませんでした。どうすればそれが動作するかどうかを調べることができますか? –

答えて

3

を返すと期待されます。 .map!を新しい文字列に対して呼び出すと、元のstrは変更されません。

バックstrからstr.split('')の結果を割り当てる:

str = str.split('') 
str.map! { |x| x + "!" } 
str # => ["a!", "b!", "c!", "d!"] 

あるいは、バックstrに全体の結果を代入する:

str = str.split('').map! { |x| x + "!" } 
str # => ["a!", "b!", "c!", "d!"] 

NOTE保存するために同じ変数を使用して

最初に文字列を保存すると、配列を保存するとコードの読者が混乱する可能性があります。あなたは配列のために異なる変数を使うことをお勧めします。

arr = str.split('') 
arr.map! { |x| x + "!" } 
arr # => ["a!", "b!", "c!", "d!"] 
+0

@steenslag、訂正ありがとう。私はそれに応じて答えを更新しました。 – falsetru

+1

OPの配列を 'str'という名前の変数に格納しようとすると、特に最初に文字列が含まれているので、かなり混乱します。この回答は、意図を明確にするために、おそらく2つの異なる変数を持つコードのより良いバージョンを提案しようとするべきです。 – SirDarius

+0

@SirDarius、私は同意します。あなたの提案を含めるように答えを更新します。コメントありがとうございました。 – falsetru

1

インプレースはyesですが、インスタンスをどこにも保存しないために浪費する配列オブジェクトを更新しているためです。

characters = "abcd".split('') 
characters.map! { |x| x + "!" } 
characters 

あなたはchars

1

split('')から移動することができます注また、あなたはそれが動作しません知っていますどのように#chars:

> "abcd".chars.map { |x| x + '!' } 
=> ["a!", "b!", "c!", "d!"] 
+0

私は、他の答えの背後にある理由を、元の実装に可能な限り近づけると理解していますが、これは私の意見では最も読みやすい解決策です。この場合、 'each_char'や' map! '(他の答えと同じように)を使用して、代わりに配置された' Array'の作成を避けることをお勧めします – engineersmnky

関連する問題