def talk(text, speed = 0.008)
pause = speed * 100
r = /(\.{3}|\.)/
text.split(r).each do |str|
if str.match?(r)
sleep(pause)
else
print str
end
end
puts
end
talk("Mary had .a lit...tle .lamb", 0.04)
#=> Mary had a little lamb
^ ^ ^
每一个由派对帽表示的字符被打印出来后,都会出现四秒的延迟。
步骤如下。
text = "Mary had .a lit...tle .lamb"
speed = 0.04
pause = speed * 100
r = /(\.{3}|\.)/
这个正则表达式读作“匹配捕获组 1 中的三个句点或 (|) 一个句点”(由括号定义的捕获组)。这与 /(\.|\.{3})/ 不同,后者将匹配每组三个单独的每个周期(即| 之前的\. 将在每个周期成功,无论是否属于一个组)。
a = text.split((r))
#=> ["Mary had ", ".", "a lit", "...", "tle ", ".", "lamb"]
请参阅String#split,它解释了捕获组需要在返回的数组中包含拆分字符串。
继续,
a.each do |str|
if str.match?(r)
sleep(pause)
else
print str
end
end
这将打印(不带换行符)"Mary had ",休眠四秒钟,打印"a lit",再休眠四秒钟,等等。
puts
需要最后一条语句来打印换行符以终止该行。
另一种方法是对问题中给出的方法进行一些小改动。
def talk(text, speed = 0.008)
pause = speed * 100
text.squeeze('.').each_char do |char|
if char == '.'
sleep(pause)
else
print char
end
end
puts
end
请参阅String#squeeze,它将两个或多个句点的每个字符串转换为一个句点。
这种方法与之前的方法不同之处在于它对连续两个或三个以上的句号进行处理。