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

在 assignmentsay = s中,Ruby 没有分配 to 的值,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 回答