Я нашел решение, которое работает, но далеко не идеально:
Я добавил padding-right : 15px
к своему div, чтобы автоматически увеличить весь div. Теперь, если появляются вертикальные полосы прокрутки, они вписываются в отступы, поэтому горизонтальная ширина все еще в порядке.
К сожалению, отступы, конечно, также обнаруживаются, когда не требуется вертикальная прокрутка, что делает мой div чуть чуть шире, чем должно было бы быть: .
Поскольку вы хотите сгруппировать по функциональности, вы можете объявить все свои методы, а затем объявить, какие из них являются защищенными и частными, используя 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
Я на самом деле поддерживаю решение 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