用Ruby

时间:2015-07-24 02:28:23

标签: ruby string

我有一个方法,它接受一个字符串作为参数,用字母表中的下一个字母替换每个字母,然后将每个元音大写。我已经让这两个人单独工作(替换和大写),但在这一点上,我只是不知道如何让他们一起工作。

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")

6 个答案:

答案 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)

这可以通过结合gsubtr来实现:

"abcdef".gsub(/[A-z]/) { |char| char.next }.tr('aeiou', 'AEIOU')
#=> "bcdEfg"
"Fun times!".gsub(/[A-z]/) { |char| char.next }.tr('aeiou', 'AEIOU')
#=> "GvO Ujnft!"