我有一个数组s_ary
,其中包含文本文档的所有行。最后一行可能类似于return some_string
。
当最后一行以return
开头时,我希望该行变为sv1 = some_string
。
我的原始代码正是我所需要的:
if s_ary.last =~ /^[\s]*return/
t = s_ary.last.gsub(/^[\s]*return/, 'sv1 = ')
s_ary.pop
s_ary << t
else
s_ary << 'sv1 = last'
end
我尝试用以下方法改进它:
if s_ary.last =~ /^[\s]*return/
s_ary.map! {|x| (x =~/return/) ? x.gsub(/return/, 'sv1 = ') : x }
else
s_ary << 'sv1 = last'
end
但是当最后一行以return
开头时,此版本将更改以return
开头的所有行。我仍然可以使用这个最后一个版本,因为这不应该发生在我的应用程序中,但我觉得必须有一个更好,更紧凑的方法来完成这个。不知何故,我找不到它。
感谢您的任何建议。
编辑:完全符合我需要的原始代码实际上(与本文第二段一致):
if s_ary.last =~ /^[\s]*return/
t = s_ary.last.gsub(/^[\s]*return/, 'sv1 = ')
s_ary.pop
s_ary << t
end
我无法相信我写了一些令人困惑的东西。道歉。
答案 0 :(得分:6)
为什么不呢:
s_ary[-1].gsub!(/^return /, 'sv1 = ')
仔细观察您的代码,也许您想要的是:
unless s_ary[-1].gsub!(/^return /, 'sv1 = ')
s_ary << 'sv1 = last'
end
如果第一个片段以return开头,则只更改最后一行,否则不执行任何操作。如果第二个代码段以return开头,则会更改最后一行,否则会附加sv1 = last
。
不确定你需要哪一个。
答案 1 :(得分:2)
arr = ["Foo is good","Bar is bad","return v1 + v2"]
arr[-1] = arr.last.sub("return","sv = ") if arr.last.start_with? "return"
p arr #=> "Foo is good", "Bar is bad", "sv = v1 + v2"]