Issue #15837 has been reported by mrkn (Kenta Murata).

----------------------------------------
Feature #15837: Module#name_components
https://bugs.ruby-lang.org/issues/15837

* Author: mrkn (Kenta Murata)
* Status: Open
* Priority: Normal
* Assignee: matz (Yukihiro Matsumoto)
* Target version: 
----------------------------------------
I sometimes wrote the expression like below to extract the components of class path:

```ruby
klass.name.split('::').last
```

Similar expressions can be found in ruby-trunk:

```
mrkn@mrkn-devel:~/src/github.com/ruby/ruby$ git grep split..::
ext/json/lib/json/common.rb:      path.to_s.split(/::/).inject(Object) do |p, c|
ext/openssl/lib/openssl/config.rb:              refsec, ref = ref.split('::', 2)
ext/psych/lib/psych/visitors/yaml_tree.rb:          method = "visit_#{(klass.name || '').split('::').join('_')}"
lib/bundler/cli/gem.rb:      constant_array = constant_name.split("::")
lib/bundler/vendor/molinillo/lib/molinillo/errors.rb:      solver_name = opts.delete(:solver_name) { self.class.name.split('::').first }
lib/bundler/vendor/thor/lib/thor/parser/argument.rb:      class_name = self.class.name.split("::").last
lib/bundler/vendor/thor/lib/thor/parser/arguments.rb:      class_name = self.class.name.split("::").last.downcase
lib/optparse/version.rb:          pkg = pkg.split(/::|\//).inject(::Object) {|m, c| m.const_get(c)}
lib/optparse/version.rb:    path.split(/::|\//).inject(base) do |klass, name|
lib/rdoc/any_method.rb:                       name = @full_name.split('::')
lib/rdoc/context.rb:          names = ename.split('::')
lib/rdoc/context.rb:    path = [prefix] + path.split('::')
lib/rdoc/method_attr.rb:        $1.split('::').last.  # ClassName => class_name
lib/rdoc/parser/c.rb:                         ([\w\. \t]+ = \s+)?rb_define_(class|module)_under[\t\w, (]*?"(#{class_name.split('::').last})"%xm then
lib/rdoc/parser/ruby.rb:      obj = name_t[:text].split("::").inject(Object) do |state, item|
lib/rdoc/store.rb:    name = klass_name.split('::').last
lib/rdoc/store.rb:    File.join @path, *klass_name.split('::')
lib/rdoc/store.rb:    method_name = method_name.split('::').last
lib/rss/atom.rb:        "#{self.class.name.split(/::/).last.downcase}="
lib/rss/atom.rb:        target.__send__(self.class.name.split(/::/).last.downcase) {|x| x}
lib/rss/atom.rb:        target.__send__("new_#{self.class.name.split(/::/).last.downcase}")
lib/rss/rss.rb:        tag_name = klass.name.split(/::/).last
spec/bundler/support/artifice/fail.rb:    const = name.split("::").reduce(Object) {|mod, sym| mod.const_get(sym) }
spec/mspec/lib/mspec/utils/name_map.rb:    c.split('::').inject(base) do |dir, name|
spec/mspec/lib/mspec/utils/name_map.rb:        name = mapping[c.split('::').last] || mapping.fetch(:default)
```

I think we need `Module#name_components` method that returns the array of symbols (or string, I prefer symbols) which comes from splitting name by `::`.



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

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>