На ruby, почему include является закрытым, а extended - открытым? - PullRequest
11 голосов
/ 18 ноября 2010

На ruby, почему include является приватным, а Object#extend публичным?

Ответы [ 3 ]

10 голосов
/ 18 ноября 2010

Object#extend имеет для публичного доступа, иначе вы не сможете его использовать. В конце концов, его целью является объединение модуля в объект, так что вы обычно называете его как obj.extend(Foo), что невозможно при использовании частных методов.

Module#include обычно используется только внутри корпуса модуля, например:

class Bar
  include Foo
end

т.е. обычно он вызывается без получателя, поэтому он не должен быть публичным. Конечно, также не должен быть приватным.

Я полагаю, причина, по которой он является частным, заключается в том, что он более инвазивен, поскольку он изменяет поведение каждого экземпляра Bar, тогда как Object#extend изменяет только один объект. Следовательно, Module#include в некотором смысле «более опасен» и, таким образом, становится приватным.

Я не знаю, является ли это действительной причиной, но это согласуется с другими подобными методами, такими как Module#define_method.

1 голос
/ 02 декабря 2010

В дополнение к ответу Йорга В. Миттага, Object # extension может также использоваться для включения методов экземпляра модуля, которые будут использоваться на уровне класса (которые также будут доступны для всех экземпляров этого класса):

module Foo
  def bar (baz)
  end
end

class Qux
  extend Foo

  bar 'asdf'
end
1 голос
/ 18 ноября 2010

Возможность запуска Foo.include(Bar) в любой момент, скорее всего, станет источником очень неприятных ошибок.

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