创建Caesar的密码时,为什么会这样?
string[i] = string[i].ord
给我一个错误信息("没有将Fixnum隐式转换为字符串"),但变量修复了问题,例如
cipher = string[i].ord
?
答案 0 :(得分:3)
这两行在含义上完全不同。
考虑你的第一个:
string[i] = string[i].ord
这意味着“将此值分配给我的字符串中的位置i
”哪个String尝试尽职尽责,但是,哦,你给了一个数字而不是一个字符串,所以它出错了。你可以解决这个问题:
string[i] = string[i].ord.to_s
第二个例子创建一个变量,这些变量不受相同的限制。
请注意,一般而言,x[i] = y
是方法调用,其中x = y
是变量赋值。
我不确定你的初始线应该做什么。用一堆数字替换单个字母似乎没有意义。如果你想突破你的角色:
string.chars.to_a
您还可以获取跳过ord
步骤的原始字节:
string.bytes.to_a
答案 1 :(得分:0)
以下是:
string[i] = string[i].ord
你试图将string[i].ord
的值Integer
分配给一个字符串数组(实际上是on-char字符串),所以因为字符数组不能接受到它排除除String
以外的任何其他行“没有将Fixnum隐式转换为字符串”意味着解释器无法将数字转换为字符串。
以下是:
cipher = string[i].ord
您正在为一个没有prevoius情况下的限制的其他变量赋值,因此分配很好。
注意:第一个示例对于rubies版本1.8及更低版本有效,因为从/到字符串获取和设置char值的类型为Integer
。
答案 2 :(得分:0)
你提到" Caesar Cipher",所以我认为你想要"移动"字符的代码点由某个值,例如13.要获得代码点,您可以使用String#ord
,就像在您的示例中一样:
str = 'ABC'
str[0].ord #=> 65
您可以添加13:
str[0].ord + 13 #=> 78
但你无法直接分配该值,因为String#[]=
不允许 1 代码点作为其参数:
str[0] = 78 #=> TypeError: no implicit conversion of Fixnum into String
然而,您可以通过Integer#chr
将代码点转换回字符 2 :
78.chr #=> "N"
或者,在一行中:
str[0] = (str[0].ord + 13).chr
str #=> "NBC"
现在另外两个字符:
str[1] = (str[1].ord + 13).chr
str[2] = (str[2].ord + 13).chr
str => "NOP"
请注意,此方法仅适用于字符A - M.
String
,Ruby没有Character
类。