[英]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"
我在这里使用了split
和join
,但是您也可以使用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.