Ruby:有条件地更改数组中的最后一个元素

时间:2013-05-03 13:34:46

标签: ruby arrays

我有一个数组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

我无法相信我写了一些令人困惑的东西。道歉。

2 个答案:

答案 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"]