Есть ли исключения в одноэлементных методах в 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 + 1
(с i
быть числом). Используя это соглашение, Ruby может эмулировать числа, представленные в виде реальных простых чисел на процессоре, для ограничения производительности и пространства, чтобы выглядеть как объекты для вашей программы Ruby.
Как Fixnum
На самом деле они не существуют как отдельные объекты в памяти, вы не можете изменить их по отдельности. Вместо этого числа считаются неизменяемыми. В основном они могут использоваться как объекты, но вы не можете их изменить, поскольку они не являются реальными дискретными объектами. В Ruby есть несколько других неизменных объектов, например false
, true
, nil
,
Для сравнения, строка будет обрабатываться как отдельный объект ruby, который может быть изменен и не является неизменным. Таким образом, он ведет себя подобно большинству других объектов Ruby, с которыми вы столкнетесь.