Частный/Защищенный блок в Ruby?

Я нашел решение, которое работает, но далеко не идеально:

Я добавил padding-right : 15px к своему div, чтобы автоматически увеличить весь div. Теперь, если появляются вертикальные полосы прокрутки, они вписываются в отступы, поэтому горизонтальная ширина все еще в порядке.

К сожалению, отступы, конечно, также обнаруживаются, когда не требуется вертикальная прокрутка, что делает мой div чуть чуть шире, чем должно было бы быть: .

8
задан Andrew Grimm 27 March 2012 в 23:17
поделиться

2 ответа

Поскольку вы хотите сгруппировать по функциональности, вы можете объявить все свои методы, а затем объявить, какие из них являются защищенными и частными, используя protected, за которым следуют символы методов, которые вы хотите защитить, и то же самое для private.

Следующий класс показывает, что я имею в виду. В этом классе все методы являются общедоступными, за исключением bar_protected и bar_private, которые в конце объявлены защищенными и частными.

class Foo

  def bar_public
    print "This is public"
  end

  def bar_protected
    print "This is protected"
  end

  def bar_private
    print "This is private"
  end

  def call_protected
    bar_protected
  end

  def call_private
    bar_private
  end

  protected :bar_protected

  private :bar_private

end
16
ответ дан 5 December 2019 в 06:38
поделиться

Я на самом деле поддерживаю решение bodnarbm и не рекомендую этого делать, но, поскольку я не могу отказаться от задачи метапрограммирования, вот хак, который выполнит это:

class Module
  def with_protected
    alias_if_needed = lambda do |first, second|
      alias_method first, second if instance_methods.include? second
    end
    metaclass = class<<self; self end
    metaclass.module_eval {|m| alias_if_needed[:__with_protected_old__, :method_added]}
    def self.method_added(method)
      protected method
      send :__with_protected_old__ if respond_to? :__with_protected_old__
    end
    yield
    metaclass.module_eval do |m|
      remove_method :method_added
      alias_if_needed[:method_added, :__with_protected_old__]
    end
  end
end
9
ответ дан 5 December 2019 в 06:38
поделиться
Другие вопросы по тегам:

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