在使用 .next 方法制作凯撒密码时遇到问题

having trouble with .next method making a casear cipher

我不担心如果我的密钥现在通过 Z 或大写字母会发生什么。我想要的只是我的结果是这样的。 text=abc key=2 并打印 "cde"。我哪里错了?

puts "What would you like to cipher?"
text = gets.chomp
puts " what number key would you like?"
key = gets.chomp.to_i

def casear_cipher(text,key)
  ciphered_text = []
  text.chars.each do |letter|
    ciphered_text = letter
    ciphered_text = ciphered_text.next
  end
end

puts casear_cipher(text,key)

您还没有使用密钥,所以它总是会执行 abc -> bcd。如果你真的不担心 "Z" 会变成 "AA",你可以试试这个:

def cipher(text, key)    
  text.chars.map { |c| (c.ord + key).chr }.join
end

由于'Z'.next => 'AA''z'.next #=> 'aa',我们可以使用[-1]到select最后一个字母。

在下面的代码中,我们使用 times 方法对每个字符执行 next!n 次。 next! 修改字符,而 next 不修改。

def casear_cipher(text, n)
  text.chars.map do |c| n.times { c.next! }
    c[-1]
  end.join
end

p casear_cipher('abc',2)   #=> "cde"
p casear_cipher('xyz',2)   #=> "zab"
p casear_cipher('ZEBRA',2) #=> "BGDTC"

有关这些方法的更多信息,请访问 http://www.ruby-doc.org/core-2.4.1/