第二个命令不执行array.map

时间:2018-03-19 18:48:45

标签: arrays ruby methods arguments notation

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

例如,如果我运行translate(" banana"),它会返回bananabay,正确添加"#{x [0]} ay"然而,第二个命令,即删除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

1 个答案:

答案 0 :(得分:0)

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

要解决此问题,您可以拨打#delete!,这可以修改字符串,也可以将删除方法的结果分配回x

x = x.delete(x[0])

但是,这会从你的字符串中移除 x[0]的所有个实例(例如“香蕉”会变成“ananaay”) - 我认为这不是你想要的功能做。

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

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

希望这有帮助!