繁体   English   中英

将字符串拆分为红宝石中的单个元素数组

[英]Split a string into a single element array in ruby

所以我写了这段代码:

def translate_word word
    vowel = ["a", "e", "i", "o", "u"]
    if vowel.include? word[0] 
        word = word + "ay"
    elsif vowel.include? word[1]
        word = word[1..-1] + word[0] + "ay"
    else
        word = word[2..-1] + word[0..1] + "ay"
    end
end

将一个单词翻译成猪拉丁语。 就我而言,效果很好。 但是,如果我们要翻译多个单词怎么办?

def translate string 
   vowel = ["a", "e", "i", "o", "u"]
   words = string.split(" ")
   words.each do |word|
     if vowel.include? word[0] 
         word = word + "ay"
     elsif vowel.include? word[1]
         word = word[1..-1] + word[0] + "ay"
     else
         word = word[2..-1] + word[0..1] + "ay"
     end
   end
   words.join(" ")
end

除非,如果我们尝试用一个单词做到这一点,它会注意到没有空格,说出螺丝,然后返回一个字符串。 尝试.each甚至都不会向我抛出错误,但是.each不会做任何事情。

puts "apple".split

#=>apple

puts translate "apple"

#=>apple

这不是一个无法解决的问题。 我可以只运行string.includes吗? “”,然后运行两个略有不同的程序,具体取决于是否存在。 但这似乎非常有说服力。 有什么更好或更惯用的方式来处理字符串和循环?

为block参数分配另一个值不会更改数组元素:

words.each do |word|
  word = word + "ay" # <- this doesn't work as expected
end

要更改元素,必须调用更改接收者的方法,例如:

words.each do |word|
  word << "ay"
end

但是,不必重复算法,您只需为每个单词调用translate_word

def translate(string)
  string.split.map { |word| translate_word(word) }.join(" ")
end

translate("apple orange")
#=> "appleay orangeay"

我在这里使用了splitjoin ,但是您也可以使用gsub

def translate(string)
  string.gsub(/\w+/) { |word| translate_word(word) }
end

据我所知,您没有操纵原始的数组单词。

您将需要以下内容:

def translate string 
   vowel = ["a", "e", "i", "o", "u"]
   words = string.split(" ")
   words.each_with_index do |word, index|
     if vowel.include? word[0] 
         word = word + "ay"
     elsif vowel.include? word[1]
         word = word[1..-1] + word[0] + "ay"
     else
         word = word[2..-1] + word[0..1] + "ay"
     end
     words[index] = word
   end
   words.join(" ")
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM