I suggest that the dynamic type can be used to implement several functions found in JRuby, Groovy, or other dynamic JVM languages, such as dynamic metaprogramming and method_missing.
For example, creating a dynamic query similar to Active Record in Rails, where the name of the method with parameters is translated into the SQL query in the background. Ruby uses the method_missing function. Something like this (theoretically - did not try to implement something like this):
class Person(val id: Int) extends Dynamic { def _select_(name: String) = { val sql = "select " + name + " from Person where id = " id; // run sql and return result } def _invoke_(name: String)(args: Any*) = { val Pattern = "(findBy[a-zA-Z])".r val sql = name match { case Pattern(col) => "select * from Person where " + col + "='" args(0) + "'" case ... } // run sql and return result } }
Allowing use, for example, here, where you can call the "name" and "findByName" methods without explicitly specifying them in the Person class:
val person = new Person(1) // select name from Person where id = 1 val name = person.name // select * from Person where name = 'Bob' val person2 = person.findByName("Bob")
If dynamic metaprogramming was to be added, you will need a dynamic type so that you can call methods that were added at run time.
eivindw Jan 17 '11 at 8:30 2011-01-17 08:30
source share