Вам разрешено переопределять класс в ruby? или это просто в IRB - PullRequest
7 голосов
/ 29 сентября 2010

Я запустил irb и набрал:

class Point end

, а затем набрал это снова, но добавил еще кое-что.

Irb не жаловалсячто я определяю класс, который уже существует.

Ответы [ 2 ]

18 голосов
/ 29 сентября 2010

На самом деле вы не переопределили класс Point, вы снова открыли его.Небольшой фрагмент кода, иллюстрирующий разницу:

class Point
  def foo
  end
end

class Point
  def bar
  end
end

Теперь Point имеет два метода: foo и bar.Таким образом, второе определение Point не заменило предыдущее определение, оно добавило к нему.Это возможно как в сценариях ruby, так и в irb (это также возможно с классами из стандартной библиотеки, а не только с вашей).

Также возможно действительно переопределить классы, используя remove_const для удаленияпредыдущая привязка имени класса сначала:

class Point
  def foo
  end
end
Object.send(:remove_const, :Point)
class Point
  def bar
  end
end
Point.instance_methods(false) #=> ["bar"]
7 голосов
/ 29 сентября 2010

В Ruby вы всегда можете добавить методы в существующий класс, даже если он базовый:

class String
  def bar
    "bar"
  end
end

"foo".bar # => "bar"

Эта функция называется " Открытые классы ." Это отличная функция, но вы должны быть осторожны: используйте ее небрежно, и вы будете патчить, как обезьяна .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...