Ruby中实现字符串按指定整数递增的方法求助
Ruby实现字符按整数递增的几种方法
嘿,我来帮你搞定这个字符递增的问题~你的需求是把字符串里的每个字符按输入的整数n往上挪n位,比如输入3时"abc"变成"def"对吧?先说说你原代码里的几个小坑:
gets获取的输入是字符串类型,直接拿来和整数比较会出错,得转成整数(to_i)才行- 尽量别用全局变量(带
$前缀的),容易引发意外的变量冲突,用局部变量更安全 - 你的循环里
x.next没有赋值给x,导致x一直是初始字符,等于白循环了,得写成x = x.next
下面给你几种更靠谱的实现方式:
方式一:ASCII码直接计算(最简洁高效)
这是最推荐的写法,利用字符和ASCII码的转换直接计算,代码清晰又高效:
puts "Enter the value of n:" n = gets.to_i original_str = "abc" result = original_str.chars.map do |char| # ord获取字符的ASCII码,加n后用chr转回字符 (char.ord + n).chr end.join puts result
比如'a'的ASCII码是97,97+3=100,100对应的字符就是'd',完全符合你的需求。
方式二:修复循环逻辑的写法
如果你想保留循环的思路,我把你的代码修正了一下,用Ruby风格的循环来实现:
puts "Enter the value of n:" n = gets.to_i original_str = "abc" original_str.chars.each do |char| current_char = char # 循环n次,每次把字符往后挪一位 n.times { current_char = current_char.next } print current_char end puts # 最后换行
这里用n.times代替了手动计数的while循环,代码更简洁,也避免了全局变量的问题。
方式三:用inject累积succ结果
Ruby的succ方法和next功能一样,我们可以用inject来累积每次递增的结果,也是一种有趣的写法:
puts "Enter the value of n:" n = gets.to_i original_str = "abc" result = original_str.chars.map do |char| # 从初始字符开始,每次执行succ,执行n次 n.times.inject(char) { |acc, _| acc.succ } end.join puts result
以上几种方式都能实现你的需求,个人最推荐第一种,代码最直观,效率也最高~
内容的提问来源于stack exchange,提问作者Jane
相关产品推荐
相关产品推荐

