ruby - 我将整数更改为字符串,但#gsub 只能识别 0-9

标签 ruby gsub

我正在自学 Ruby,其中一项作业是生成凯撒密码。 使用#gsub,我已经能够将我的字母更改为整数 ('c' => 2),移动它们,然后将新整数更改为字符串 (2 => "2")。

我碰壁了,Ruby 文档没有帮助。当我尝试将字符串 #gsub 变回字母 ("2"=> 'c') 时,它只能识别 0-9。之后的所有内容只是这些数字的串联(“12”=>“bc”而不是 =>“l”)。

为什么 Ruby 会这样,我该如何解决?

感谢您的帮助。

代码:(我知道这是草率的初学者代码;通过后我会尝试编辑它)

def convert_to_integer
    puts "What would you like to encode?"
    words = gets.chomp

    words = words.split("")
    words.map { |words| words.gsub!(/[a-z]/, 'a' => 0, 'b' => 1, 'c' => 2, 'd' => 3, 'e' => 4, 'f' => 5, 'g' => 6, 'h' => 7, 'i' => 8, 'j' => 9, 'k' => 10, 'l' => 11, 'm' => 12, 'n' => 13, 'o' => 14, 'p' => 15, 'q' => 16, 'r' => 17, 's' => 18, 't' => 19, 'u' => 20, 'v' => 21, 'w' => 22, 'x' => 23, 'y' => 24, 'z' => 25)
    }
    integer = words.map! { |letter| letter.to_i }

    return integer
end

def shift_left(integer, number = 0)
    puts "How many letters (to the left) would you like to shift it?"
    number = gets.to_i

    integer.map! { |n| n - number }

    return integer
end

def convert_to_letter(integer)
    integer.map! { |integer| integer.to_s }

    integer.map! { |n| n.gsub(/[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]/, '0' => 'a', '1' => 'b', '2' => 'c', '3' => 'd', '4' => 'e', '5' => 'f', '6' => 'g', '7' => 'h', '8' => 'i', '9' => 'j', '10' => 'k', '11' => 'l', '12' => 'm', '13' => 'n', '14' => 'o', '15' => 'p', '16' => 'q', '17' => 'r', '18' => 's', '19' => 't', '20' => 'u', '21' => 'v', '22' => 'w', '23' => 'x', '24' => 'y', '25' => 'z')
    }
    print integer
end
convert_to_letter(shift_left(convert_to_integer))    

最佳答案

你不需要在那里做一个gsubgsub 通常用于替换较大字符串的部分。你想更换整个东西。

这应该可以解决问题:

def convert_to_letter(integers)
  replacements = {0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd', 4 => 'e', 
    5 => 'f', 6 => 'g', 7 => 'h', 8 => 'i', 9 => 'j', 10 => 'k', 
    11 => 'l', 12 => 'm', 13 => 'n', 14 => 'o', 15 => 'p', 16 => 'q', 
    17 => 'r', 18 => 's', 19 => 't', 20 => 'u', 21 => 'v', 22 => 'w', 
    23 => 'x', 24 => 'y', 25 => 'z'  
  }

  integers.map{|x| replacements[x]}.join
end

另外,要小心破坏性操作(此处为 map!)。您可能会遇到意外的副作用(例如,某些数组会在您认为不应该更改时更改)。

关于ruby - 我将整数更改为字符串,但#gsub 只能识别 0-9,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29180251/

相关文章:

ruby-on-rails - 奇数 rake db :migrate output

arrays - 如何在调用 Array#compact 时删除自定义类

ruby - 有人在 Ruby 1.9.3 下使用 FTPS/FTP::TLS 吗?

r - gsub 查找模式

r - 如何从 R 中的 Ensembl ID 列表中删除后缀

ruby-on-rails - 使用另一个模型 ID 的 Rails 自定义路由

ruby-on-rails - Rails 用户个人资料页面只能由正确的用户访问

删除第一个和第二个下划线之前和之后的字符提取第一个和第二个下划线之间的字符串

r - gsub 并删除 R 中 < 和 > 之间的所有字符

R 中使用 gsub 删除尾随空格