Есть ли исключения в одноэлементных методах в Ruby?

В Ruby все является объектом. Но когда я пробую однозначный метод для числа, я получаю ошибку типа. Есть ли исключения из понятия, что все является объектом?

a_str = "Ruby"
a_num = 100

def a_str.bark
  puts "miaow"
end

a_str.bark #=> miaow (Good Cat!)

def a_num.bark
  puts "miaow"
end

a_num.bark #=> TypeError: can't define singleton method "bark" for Fixnum

1 ответ

Решение

Числа являются своего рода особыми, поскольку на самом деле они не существуют как реальные объекты в памяти. Это было бы неосуществимо, поскольку их бесконечно много.

Вместо этого Ruby эмулирует их как объекты, используя определенные соглашения. то есть вы заметите, что object_id из Fixnum всегда 2 * i + 1i быть числом). Используя это соглашение, Ruby может эмулировать числа, представленные в виде реальных простых чисел на процессоре, для ограничения производительности и пространства, чтобы выглядеть как объекты для вашей программы Ruby.

Как FixnumНа самом деле они не существуют как отдельные объекты в памяти, вы не можете изменить их по отдельности. Вместо этого числа считаются неизменяемыми. В основном они могут использоваться как объекты, но вы не можете их изменить, поскольку они не являются реальными дискретными объектами. В Ruby есть несколько других неизменных объектов, например false, true, nil,

Для сравнения, строка будет обрабатываться как отдельный объект ruby, который может быть изменен и не является неизменным. Таким образом, он ведет себя подобно большинству других объектов Ruby, с которыми вы столкнетесь.

Другие вопросы по тегам