替换 ruby​​ 字符串中的行

mje*_*kov 2 ruby

我正在尝试使用each_line 方法循环包含多行的Ruby 字符串,但我也想更改它们。我正在使用以下代码,但它似乎不起作用:

string.each_line{|line| line=change_line(line)}
Run Code Online (Sandbox Code Playgroud)

我想,Ruby 正在发送我的行的副本,而不是行本身,但不幸的是没有方法each_line!。我也尝试过gsub!方法,使用 /^.*$/ 来检测每一行,但似乎它只调用change_line方法并用它替换所有行。有什么想法如何做到这一点吗?提前致谢 :)

Sea*_*ren 5

@azlisum:您没有存储连接的结果。使用:

output = string.lines.map{|line|change_line(line)}.join
Run Code Online (Sandbox Code Playgroud)

比较字符串中按行处理的四种方法:

# Inject method (proposed by @steenslang)
output = string.each_line.inject(""){|s, line| s << change_line(line)}

# Join method (proposed by @Lars Haugseth)
output = string.lines.map{|line|change_line(line)}.join

# REGEX method (proposed by @olistik)
output = string.gsub!(/^(.*)$/) {|line| change_line(line)}

# String concatenation += method (proposed by @Erik Hinton)
output = "" 
string.each_line{|line| output += change_line(line)}                   
Run Code Online (Sandbox Code Playgroud)

基准时间:

                   user     system      total        real
Inject Time:   7.920000   0.010000   7.930000 (  7.920128)
Join Time:     7.150000   0.010000   7.160000 (  7.155957)
REGEX Time:   11.660000   0.010000  11.670000 ( 11.661059)
+= Time:       7.080000   0.010000   7.090000 (  7.076423)
Run Code Online (Sandbox Code Playgroud)

正如 @steenslag 指出的, 's += a' 将为每个连接生成一个新字符串,因此通常不是最佳选择。

因此,考虑到这一点,考虑到时代,你最好的选择是:

output = string.lines.map{|line|change_line(line)}.join
Run Code Online (Sandbox Code Playgroud)

另外,恕我直言,这是看起来更干净的选择。

注释:
使用 Benchmark
Ruby-Doc: Benchmark