Ruby - string [i] = string [i] .ord错误

时间:2016-05-26 21:13:40

标签: ruby-on-rails ruby ascii

创建Caesar的密码时,为什么会这样?

string[i] = string[i].ord

给我一​​个错误信息("没有将Fixnum隐式转换为字符串"),但变量修复了问题,例如

cipher = string[i].ord

3 个答案:

答案 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)

  1. 以下是:

    string[i] = string[i].ord
    

    你试图将string[i].ord的值Integer分配给一个字符串数组(实际上是on-char字符串),所以因为字符数组不能接受到它排除除String以外的任何其他行“没有将Fixnum隐式转换为字符串”意味着解释器无法将数字转换为字符串。

  2. 以下是:

    cipher = string[i].ord
    

    您正在为一个没有prevoius情况下的限制的其他变量赋值,因此分配很好。

  3. 注意:第一个示例对于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.

  1. 或者"不再是",在Ruby 1.9中删除了该功能。
  2. 实际上是一个字符String,Ruby没有Character类。