In Scala, nesting can be done just about anything inside anything. functions can be define inside other functions, and classes inside other classes. Here are some simple examples.
use case 1:
scala> class eduprwa {
class Member(val name: String) {
val course = new ArrayBuffer[Member]
}
private val members = new ArrayBuffer[Member]
def join(name: String) = {
val m = new Member(name)
members += m
m
}
}
class eduprwa
scala> val BigData = new eduprwa
scala> val DataScience = new eduprwa
scala> val Hadoop = new eduprwa

//In our eduprwa example, you can add a member within its own eduprwa, but not across networks.

use case 2:
scala> import scala.collection.mutable.ArrayBuffer
scala> class prwatech{
class Member(val name: String){
val contacts = new ArrayBuffer[Member]
}
private val members = new ArrayBuffer[Member]
def join(name: String) = {
val m = new Member(name)
members +=m
m
}
}
Scala>val a1 = new prwatech
scala> val b1 = new prwatech
scala> val fruit = a1.join(“Fruit”)
scala> val wolf = a1.join(“Wolf”)
scala> fruit.contacts += wolf
scala> val beer = b1.join(“Beer”)
scala> a1.contacts += beer

use case 3:
scala> class Animal{
class Member(val name: String){
val contacts = new ArrayBuffer[Member]
}
private val members = new ArrayBuffer[Member]
def join(name: String) = {
val m = new Member(name)
members +=m
m
}
}
scala> val petanimal = new Animal
scala> val wildanimal = new Animal
scala> val cat = petanimal.join(“Cat”)
scala> val dog = petanimal.join(“Dog”)
scala> cat.contacts += dog
scala> val lion = wildanimal.join(“Lion”)
scala> cat.contacts += lion
