2

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

但是这个版本将改变所有returnreturn. 我仍然可以使用最后一个版本,因为这不应该在我的应用程序中发生,但我觉得必须有一种更好、更紧凑的方法来实现这一点。不知怎的,我找不到它。

感谢您的任何建议。

编辑: 正是我需要的原始代码实际上是(与这篇文章的第二段一致):

if s_ary.last =~ /^[\s]*return/
  t = s_ary.last.gsub(/^[\s]*return/, 'sv1 = ')
  s_ary.pop
  s_ary << t
end

我不敢相信我写了这么令人困惑的东西。我很抱歉。

4

2 回答 2

6

为什么不只是:

s_ary[-1].gsub!(/^return /, 'sv1 = ')

编辑

仔细查看您的代码,也许您想要的是:

unless s_ary[-1].gsub!(/^return /, 'sv1 = ')
  s_ary << 'sv1 = last'
end

如果第一个片段以 return 开头,则只会更改最后一行,否则什么也不做。如果第二个片段以 return 开头,它将更改最后一行,sv1 = last否则将追加。

不确定你需要哪一个。

于 2013-05-03T13:40:19.333 回答
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"]
于 2013-05-03T13:46:28.353 回答