Определение методов на экземплярах Fixnum

Я могу определить метод для экземпляра следующим образом:

object = Object.new
def object.foo
  puts "5"
end

Пытаясь что-то подобное с Fixnum не работает:

def 3.foo
  puts "3"
end

def 3.foo
     ^
(irb):7: syntax error, unexpected keyword_end, expecting end-of-input

В чем причина этого?

Я знаю, что это то, что я никогда не должен делать. Мне просто интересно, почему это не работает так, как я ожидал.

1 ответ

Решение

Здесь есть две вещи.

Одна вещь в том, что FixnumНе может быть одноэлементных методов. Но мы еще не дошли до этого момента, поскольку в вашем коде есть синтаксическая ошибка, и поэтому Ruby даже не пытается запустить его с самого начала.

Во-вторых, синтаксис Ruby сложен, и поэтому существует много темных угловых случаев. Вы, кажется, нашли тот, где различное использование . Символ, означающий, что и десятичный разделитель, и селектор метода конфликтуют друг с другом таинственным образом.

Теперь, конечно, это на самом деле не большая проблема, так как, как я упоминал ранее, FixnumВ любом случае, не может быть синглтон-класса:

object = 3

def object.foo
  puts "3"
end
# TypeError: can't define singleton
Другие вопросы по тегам