なぜマップ!分割された文字列で動作しませんか?マップで分割!動作しません
str = "abcd"
str.split('').map! { |x| x + "!" }
str # => "abcd"
私は、これは新しい配列を返すstr.split('')
["a!","b!","c!","d!"]
なぜマップ!分割された文字列で動作しませんか?マップで分割!動作しません
str = "abcd"
str.split('').map! { |x| x + "!" }
str # => "abcd"
私は、これは新しい配列を返すstr.split('')
["a!","b!","c!","d!"]
を返すと期待されます。 .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!"]
インプレースはyesですが、インスタンスをどこにも保存しないために浪費する配列オブジェクトを更新しているためです。
characters = "abcd".split('')
characters.map! { |x| x + "!" }
characters
あなたはchars
へsplit('')
から移動することができます注また、あなたはそれが動作しません知っていますどのように#chars
:
> "abcd".chars.map { |x| x + '!' }
=> ["a!", "b!", "c!", "d!"]
私は、他の答えの背後にある理由を、元の実装に可能な限り近づけると理解していますが、これは私の意見では最も読みやすい解決策です。この場合、 'each_char'や' map! '(他の答えと同じように)を使用して、代わりに配置された' Array'の作成を避けることをお勧めします – engineersmnky
を使用することができますか? 'map!' pingの配列への参照は決して割り当てられませんでした。どうすればそれが動作するかどうかを調べることができますか? –