Practical uses of a Dynamic type in Scala

前端 未结 3 472
耶瑟儿~
耶瑟儿~ 2020-12-07 22:41

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?

3条回答
  •  佛祖请我去吃肉
    2020-12-07 23:06

    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..

提交回复
热议问题