Issue #9064 has been updated by Rodrigo Rosenfeld Rosas.


Not all reasons, but important ones in my opinion specially as you get big namespaces and nesting level.

I didn't want to mix everything in a single request, but since you're asking for more reasons/motivation let me also state what else I'd like to be added in case packages are approved.

The first immediate benefit is that we could have something like this:

~~~
# a/b/my_class.rb
package A::B

class MyClass
end

# a/b/c/specialized_class.rb
require_relative '../my_class'
package A::B::C

class SpecializedClass
  def initialize
    @my_class = MyClass.new # rather than A::B::MyClass.new
  end
end

# Another feature I'd like added but I haven't included in this ticket when I created waiting for a future ticket as it's an enhancement over the original packaging system: "use"

# j/k/other_class.rb
package J::K
require 'a/b/my_class'
use A::B::MyClass # or A::B or A::B::* or import rather than use, that's why I haven't proposed it yet, I don't have this part clear yet.
class OtherClass < MyClass
end
~~~

I can see lots of good things coming from some packaging system and it would also encourage more namespaces usage if people wouldn't have to type a lot to use inner classes.

But specially the search path would always be the same when using namespaces/packages.

For instance, consider this example:

~~~
# a/b/namespace.rb
module A
  module B
  end
end

# my_class.rb
require 'a/b/namespace'

class A::B::MyClass
end

# This is different from below with regards to the search path which I find to be a (non-obvious) problem.

module A
  module B
    class MyClass
    end
  end
end
~~~


Now, you got me curious about what you have in mind when you talk about integrating something like Node's packaging system into Ruby. I can't really understand how that would play well with the way Ruby works... Could you please provide an example of how you envision such packaging system in Ruby? Maybe I could like your idea better than mine...

----------------------------------------
Feature #9064: Add support for packages, like in Java
https://bugs.ruby-lang.org/issues/9064#change-48108

* Author: Rodrigo Rosenfeld Rosas
* Status: Feedback
* Priority: Normal
* Assignee: Yukihiro Matsumoto
* Category: core
* Target version: 
----------------------------------------
In Java, it's easy to define a package for a certain class:

package com.company.MyClass

We don't use that convention in Ruby but we have another way of packaging classes:

module MyLibrary
  module InnerNamespace
    class MyClass
    end
  end
end

I'd prefer to be able to use something like this instead meaning exactly the same thing:

package MyLibrary::InnerNamespace # or MyLibrary.InnerNamespace, I don't really care
class MyClass
end

Could you please consider this idea?

---Files--------------------------------
feature-9064.pdf (16.7 KB)


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