Issue #6539 has been updated by matz (Yukihiro Matsumoto).

Assignee changed from matz (Yukihiro Matsumoto) to nobu (Nobuyoshi Nakada)

Concrete counter proposal:

Should be made private:
  Object and descendants
    #initialize_clone
    #initialize_dup
    #respond_to_missing?
  Rational & Complex
    #marshal_dump
    #marshal_load
  Time
    #_dump
    ._load

Note that Delegate#initialize_{clone|dup} are already private

Should be made public:

  Object
    #remove_instance_variable

I think class/module operations should be done in the scope.

Matz.
 
----------------------------------------
Feature #6539: public and private for core methods
https://bugs.ruby-lang.org/issues/6539#change-31777

Author: marcandre (Marc-Andre Lafortune)
Status: Assigned
Priority: Normal
Assignee: nobu (Nobuyoshi Nakada)
Category: core
Target version: 2.0.0


I feel there are inconsistencies in which methods are public and which are private.

For example:

  obj = []
  prev = obj.instance_variable_get(:@foo) # allowed
  obj.instance_variable_set(:@foo, nil)    # allowed
  # But these are almost equivalent to:
  prev = obj.remove_instance_variable(:@foo)
    # => NoMethodError: private method `remove_instance_variable' called for []:Array

Another example:

  module M
    def foo
      42
    end
  end

  M.module_function :foo # private method `module_function' called for M:Module
  M.extend M             # allowed
  M.foo # => 42

Reverse example:

  {}.method_missing :foo    # => private method `method_missing' called
  {}.respond_to_missing? :foo, false   # => allowed, why?

Which methods should be private is a different question for Ruby than for apps and libraries; the "real" private methods of Ruby are in C!
For Ruby, I feel that a method should be private if it is *not meant to be called* except by Ruby itself (callbacks, etc...), or if it's a "global" methods of Kernel that is meant to be called directly (i.e. `puts` instead of `42.puts`)

Otherwise, it should be public. This includes methods like `Module#include`.

I don't know what the rationale was to make `include` and the like private.

I feel it is now quite common to use metaprogramming, e.g. to `include` modules from outside a class. It's part of a Class' API that it can be extended and modified, so these methods should be public.

Concrete proposal:

Should be made private:
  Object and descendants
    #initialize_clone
    #initialize_dup
    #respond_to_missing?
  Rational & Complex
    #marshal_dump
    #marshal_load
  Time
    #_dump
    ._load

Note that Delegate#initialize_{clone|dup} are already private

Should be made public:

  Object
    #remove_instance_variable
  Module
    #attr
    #attr_reader
    #attr_writer
    #attr_accessor
    #remove_const
    #include
    #remove_method
    #undef_method
    #alias_method
    #public
    #protected
    #private
    #module_function
    #define_method



-- 
http://bugs.ruby-lang.org/