第二个命令不执行 array.map



我在下面有这段代码,我的最后一个elsif语句有两个命令。 问题是当我运行代码时,只执行第一个命令。

例如,如果我运行 translate("banana"(,它会返回 bananabay,正确地将"#{x[0]}ay"添加到数组 banana 但是,删除 x[0] 的第二个命令没有执行,我得到了 bananabay 作为返回而不是预期的 ananabay。

你认为发生了什么?

在这里代码:

def translate(word)
  vowels = ["a","e","i","o","u"]
  consonants = ["b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z"]
  word = word.split
  word.map{ |x|
    if vowels.include? x[0]
      x=x << "ay"
    elsif consonants.include? x[0] && x[1]
      "#{x[2..-1]}#{x[0]}#{x[1]}ay"
    elsif consonants.include? x[0]
      x = x << "#{x[0]}ay"
      x.delete(x[0])
      x
    end 
  }.join(" ")
end
字符串返回不变

是因为#delete调用时不会更改原始输入 - 它返回反映结果的新字符串。

要解决此问题,您可以调用 #delete! ,这将就地修改字符串,或者您可以将 delete 方法的结果分配回 x

x = x.delete(x[0])

但是,这将从字符串中删除所有x[0]实例(例如"banana"会变成"ananaay"(-我认为这不是您希望函数执行的操作。

如果您只想删除目标字母的第一个实例,则可以调用 #sub ,如下所示:

x = x.sub(x[0], "")

希望这有帮助!

最新更新