我有一个方法,它接受一个字符串作为参数,用字母表中的下一个字母替换每个字母,然后将每个元音大写。我已经让这两个人单独工作(替换和大写),但在这一点上,我只是不知道如何让他们一起工作。
def LetterChanges(str)
new_str = str.downcase.split("")
new_str.each do |x|
x.next!
end
new_str.to_s.tr!('aeiou','AEIOU')
return new_str.join("")
end
LetterChanges("abcdef")
答案 0 :(得分:4)
new_str.to_s
未存储在任何地方。它不会影响原始数组。
return new_str.join("").tr('aeiou', 'AEIOU')
这会将数组转换回字符串,您可以对 进行操作并将其返回。
答案 1 :(得分:1)
可以使用gsub
解决这个问题。
"abcdef".gsub(/./){|char| char.next}.gsub(/[aeiou]/){|vowel| vowel.upcase}
#=> "bcdEfg"
所以方法可以
def letter_changes_gsub(str)
str.gsub(/./){|char| char.next}.gsub(/[aeiou]/){|vowel| vowel.upcase}
end
使用数组更快更简单。
答案 2 :(得分:1)
其他答案已经向您展示了如何组合代码的两个部分。但"z"
后another issue String#next
String#tr
继续巫婆"z".next #=> "aa"
:
if
你可以添加str.chars.map do |char|
if char == 'z'
'a'
else
char.next
end
end.join
语句来处理这种情况:
str.chars.map { |char| char == 'z' ? 'a' : char.next }.join
或:
str.downcase.tr('a-z', 'bcdEfghIjklmnOpqrstUvwxyzA')
但是有一个更简单的方法:让http://developer.android.com/reference/android/view/SurfaceView.html#setZOrderOnTop(boolean)执行整个替换:
str.downcase.tr('a-z', 'bcdEfghIjk-nOp-tUv-zA')
或略短:
$.ajax({
type: 'GET',
url: 'http://xxx.amazonaws.com/file.json',
dataType: 'jsonp',
jsonpCallback: 'callback',
success: function(json){
console.log(json);
}
});
答案 3 :(得分:0)
2.1.0 :012 > 'abcdef'.split('').map(&:next).join.tr('aeiou', 'AEIOU')
=> "bcdEfg"
当然,我不建议在一行中这样做。但是为了让您对这些方法如何串联起来感到困惑,这里有一个有效的解决方案。如有疑问,请使用IRB调用每个方法并观察Ruby如何响应。这将帮助您找出代码中断的位置。
在实践中,我会将其分解为多种方法。一种方法要做的事情太多了。正如你所发现的那样,找到错误(和测试)也困难得多。
def rotate(string)
string.split('').map(&:next).join
end
def capitalize_vowels(string)
string.tr('aeiou', 'AEIOU')
end
答案 4 :(得分:0)
怎么样:
def string_thing(string)
string.downcase.tr('abcdefghijklmnopqrstuvwxyz','bcdEfghIjklmnOpqrstUvwxyzA')
end
#tr
只会将第一个参数中的每个字符替换为第二个参数中的相应字符。
答案 5 :(得分:0)
这可以通过结合gsub
和tr
来实现:
"abcdef".gsub(/[A-z]/) { |char| char.next }.tr('aeiou', 'AEIOU')
#=> "bcdEfg"
"Fun times!".gsub(/[A-z]/) { |char| char.next }.tr('aeiou', 'AEIOU')
#=> "GvO Ujnft!"