2016-05-26 4 views

ответ

3

Эти две линии полностью различаются по смыслу.

Рассмотрим ваш первый один:

string[i] = string[i].ord 

Это означает «присвоить это значение позиции i в моей строке», которая пытается Струнный послушно делать, кроме, ну да, вы дали номер вместо строки поэтому он ошибается. Вы можете исправить это:

string[i] = string[i].ord.to_s 

Второй пример создает переменную, и те не могут быть защищены.

Помните, что в общих чертах x[i] = y является вызовом метода , где x = y является присвоением переменной.

Я не уверен, что должна делать ваша начальная линия. Кажется, нет смысла заменять одну букву кучей чисел. Если вы хотите, чтобы вырваться из ваших персонажей:

string.chars.to_a 

Вы также можете получить исходные байты, которые пропускают ord шага:

string.bytes.to_a 
+0

Ahhh crystal clear now. Спасибо! Не понимая логики, что это действительно заводило меня! –

+0

Нет проблем. Если вы исходите из языка с автоматическим преобразованием типа, такого как Perl, PHP или JavaScript, то упорный отказ Ruby справиться с чем-то подобным может показаться раздражающим. '' 1'' и '1' - это не одно и то же в Ruby. Вам нужно будет преобразовать, если вы хотите объединить значения. – tadman

+1

"' x = y' является присваиванием переменной, предполагающим, что 'x =' не определяется как метод. " Нет. Это переменное назначение. Период. Локальные переменные определяются во время разбора, методы определяются во время выполнения. Парсенсуру нет никакого способа узнать, существует ли такой метод в этой точке кода. –

0
  1. Вот:

    string[i] = string[i].ord 
    

    вы пытается присвоить значение string[i].ord, которое является Integer в строку, которая представляет собой массив символов (на самом деле он- char), так как массив символов не может принимать в свою строку любые другие, кроме String, вы получили исключение «нет неявного преобразования Fixnum в String», что означает, что интерпретатор не может преобразовать число в строку.

  2. Вот:

    cipher = string[i].ord 
    

    вы присваиваете значение с другой переменной, которая не имеет таких ограничений, как в prevoius случае, так что назначение apssed хорошо.

Примечание: Это первый пример был действителен для рубинов версии 1.8 и ниже, так как получение и установка значения обугленного из/в строке имеет тип Integer.

0

Вы упоминаете «Цезарский шифр», поэтому я понимаю, что вы хотите «переместить» код символа на некоторое значение, например. 13.Чтобы получить элемент кода, вы можете использовать String#ord, так же, как в вашем примере:

str = 'ABC' 
str[0].ord #=> 65 

Вы можете добавить 13:

str[0].ord + 13 #=> 78 

Но вы не можете напрямую назначить это значение, поскольку String#[]= не позволяет элемент кода в качестве аргумента:

str[0] = 78 #=> TypeError: no implicit conversion of Fixnum into String 

однако вы можете преобразовать обратно в элемент кода символа через Integer#chr:

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.