正确使用String#tr方法?

时间:2018-06-30 21:28:40

标签: crystal-lang

Crystal-lang的新手,我实际上是在尝试编码Caesar密码。 问题是,当我输入一个字符串进行编码时,程序会显示相同的字符串而无需修改。

if ARGV.size < 3
  puts "./caesarcipher [ed] [text] [num]"
  exit
end

letter = ARGV[0]
str = ARGV[1]
n = ARGV[2].to_i
alphabet = ("A".."Z").to_a

case letter
when "e" then puts str.tr(alphabet.join, alphabet.rotate(n).join)
when "d" then puts str.tr(alphabet.join, alphabet.rotate(n * -1).join)
else          puts "./caesarcipher [ed] [text] [num]"
end

由于tr方法中的两个参数包含我想要的内容,并且tr必须返回一个值,所以我不明白为什么什么都没有改变。

1 个答案:

答案 0 :(得分:1)

欢迎堆栈溢出!

之所以对您不起作用,是因为如果您检查alphabet数组,实际上它只是大写字母。因此,在翻译中,您仅翻译大写字符。如果您改为

alphabet=("a".."z").to_a

将转换为小写字母。

如果您想两者都做,那么我建议创建两个“字母”,一个带有大写字母,一个带有小写字母,然后在字符串上应用两次翻译,一个带有大写字母,另一个带有小写字母。 / p>