Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Practical uses of a Dynamic type in Scala

Tags:

types

scala

Besides integration with dynamic languages on the JVM, what are the other powerful uses of a Dynamic type in a statically typed language like Scala?

like image 372
Adam Rabung Avatar asked Jan 17 '11 01:01

Adam Rabung


People also ask

What is dynamic in Scala?

Scalas type Dynamic allows you to call methods on objects that don't exist or in other words it is a replica of "method missing" in dynamic languages. It is correct, scala. Dynamic doesn't have any members, it is just a marker interface - the concrete implementation is filled-in by the compiler.

Is Scala dynamic typing?

Scala is a unique language in that it's statically typed, but often feels flexible and dynamic.


1 Answers

I guess a dynamic type could be used to implement several of the features found in JRuby, Groovy or other dynamic JVM languages, like dynamic metaprogramming and method_missing.

For example creating a dynamic query similar to Active Record in Rails, where a method name with parameters is translated to an SQL query in the background. This is using the method_missing functionality in Ruby. Something like this (in theory - have not tried to implement anything 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 usage like this, where you can call methods 'name' and 'findByName' without having them explicitly defined 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, the Dynamic type would be needed to allow invoking methods that have been added during runtime..

like image 156
eivindw Avatar answered Sep 22 '22 10:09

eivindw