1

単語やフレーズを何度も繰り返す方法をまとめてみましたt。私はもっ​​と良い方法を見つけましたが、なぜこれがそのように振る舞ったのかはまだわかりません。

# repeats the word s t times for a default of 2
def repeat s, t = 2
    say = s
    t -= 1
    t.times { say << ' ' + s }
    say
end

repeat('hi', 1) # => 'hi'
repeat('hi', 2) # => 'hi hi'
repeat('hi', 3) # => 'hi hi hi hi' [4x]
repeat('hi', 4) # => 'hi hi hi hi hi hi hi hi' [8x]
repeat('hi', 5) # => 'hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi' [16x]

timesブロック内では、各反復後sと同じものに設定されているようです。sayなぜこの動作が発生するのですか?

4

2 に答える 2

3

割り当てsay = sでは、Rubyはの値を割り当てるのではsなくsay、の参照(メモリ位置)を割り当てますs。つまり、メモリ内の同じ文字列ssay指します。次に、この行say << ' ' + sで、Rubyは最初に連結の値を使用して新しい文字列を作成し' ' + s、次にこれを。が指す文字列に追加しsayます。saysが同じ文字列を指しているため、sも変更されます。

s基本的には、すべてを。に置き換えた場合と同じですsay

目的のことを実行するための代替案については、@AJcodezからの回答を参照してください。

于 2013-01-05T04:55:03.057 に答える
2

その理由は、文字列のシャベル演算子<<がコンテンツを文字列自体に追加し、say = s@ iamnotmaynardが指摘したように、を割り当てると、参照を割り当てるためです。

よりわかりやすく説明するために、次の変更により、repeat意図したとおりに実行されます。

say = s.dup   # make an actual copy

または、+=代わりにを使用<<して、毎回新しい文字列を作成することもできます(これはを指していませんs

t.times { say += ' ' + s }
于 2013-01-05T05:03:34.053 に答える