Как сделать переменные экземпляра частными в Ruby?

Там какой-либо путь состоит в том, чтобы сделать переменные экземпляра "частными" (C++ или определение Java) в рубине? Другими словами, я хочу, чтобы следующий код привел к ошибке.

class Base
  def initialize()
    @x = 10
  end
end

class Derived < Base
  def x
    @x = 20
  end
end

d = Derived.new
34
задан Andrew Grimm 24 January 2012 в 22:02
поделиться

2 ответа

В отличие от методов, имеющих разные уровни видимости, переменные экземпляра Ruby всегда являются частными (снаружи объекты). Тем не менее, переменные экземпляра внутри объектов всегда доступны либо от родителей, класса детей или включенных модулей.

Так как там, вероятно, нет способа изменить, как Ruby Access @x , я не думаю, что у вас может быть какой-либо контроль над ним. Письмо @X только что напрямую выберут эту переменную экземпляра, а поскольку Ruby не обеспечивает контроль видимости по переменным, живут с ним, я думаю.

Как говорит @marcgg, если вы не хотите, чтобы вы найдете полученные классы, чтобы коснуться переменных экземпляров, не используйте его вообще или найдите умный способ скрыть его от просмотра полученных классов.

5
ответ дан 27 November 2019 в 16:25
поделиться

Как и большинство вещей в Ruby, переменные экземпляра не являются действительно «частными» и могут быть доступны никому с D.instance_Variable_get: @x .

В отличие от Java / C ++, однако, переменные экземпляра в Ruby всегда частные. Они никогда не являются частью публичных API, подобных типам методов, поскольку их можно получить только с этим добросовестным добычей. Поэтому, если в вашем API есть какое-либо здравомыслие, вам не нужно беспокоиться о том, что кто-то злоупотребляет вашим переменным экземпляра, поскольку они будут использовать методы вместо этого. (Конечно, если кто-то хочет пойти на дикий и получить доступ к частным методам или переменным экземпляра, нет способа их остановки.)

Единственная проблема заключается в том, что если кто-то случайно переписывает переменную экземпляр при Они расширяют ваш класс. Что можно избежать, используя маловероятные имена, возможно, вызывая его @BASE_X в вашем примере.

35
ответ дан 27 November 2019 в 16:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: