Ruby / IRB: установить переменную экземпляра в private или иначе невидимую? - PullRequest
3 голосов
/ 19 июля 2011

В Ruby, когда я делаю что-то вроде этого:

class Foo
  ...
  def initialize( var )
    @var = var
  end
  ...
end

Затем, если я возвращаю foo в консоли, я получаю это представление объекта:

#<Foo:0x12345678910234 @var=...........>

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

Мой вопрос: есть ли способ установить переменную экземпляра вобъект "private" или иным образом невидимый, чтобы он не печатался как часть представления объекта, если этот объект возвращен в консоли?

Спасибо!

1 Ответ

4 голосов
/ 19 июля 2011

После некоторого быстрого поиска я не думаю, что Ruby поддерживает частные переменные экземпляра. Лучше всего переопределить метод to_s вашего объекта (или патч обезьяны Object#to_s), чтобы выводить только переменные экземпляра, которые вы хотите видеть. Чтобы упростить задачу, вы можете создать черный список переменных, которые вы хотите скрыть:

class Foo
  BLACK_LIST = [ :@private ]

  def initialize(public, private)
    @public = public
    @private = private
  end

  def to_s
    public_vars = self.instance_variables.reject { |var|
      BLACK_LIST.include? var
    }.map { |var|
      "#{var}=\"#{instance_variable_get(var)}\""
    }.join(" ")

    "<##{self.class}:#{self.object_id.to_s(8)} #{public_vars}>"
  end
end

Обратите внимание, что они по-прежнему будут доступны через obj.instance_variables и obj.instance_variable_get, но по крайней мере они не будут мешать вашей отладке.

...