Re[4]: Ваше отношение к языку Scala
От: aka50 Россия  
Дата: 02.06.07 11:59
Оценка:
Здравствуйте, mini_root_2, Вы писали:

__>Хорошо возможно это я ступил, тогда подскажите мне как можно например сделать что-то такое


Дело в том, что A — это тип, а match работает с объектами.

По этому можно сделать иначе
object pm4 extends Application {
  
  class ResultSet {
     def getInt(col: int): int = 1
     def getDouble(col: int): double = 1.0
     def getString(col: int): String = "Hello"
     def value[A](col: int)(implicit f: (ResultSet, int) => A): A = f(this, col)  
  }
  
  implicit def viewRsToInt(rs: ResultSet, col: int): int = rs.getInt(col)
  implicit def viewRsToDouble(rs: ResultSet, col: int): double = rs.getDouble(col)
  implicit def viewRsToString(rs: ResultSet, col: int): String = rs.getString(col)
  
  val rs = new ResultSet
  
  // Указываем чего точно хочем
  val i =  rs.value[int](1)
  println(i);
  val s = rs.value[String](2)
  println(s);

  // через абстрактный тип T  
  type T = double
  val t = rs.value[T](3)
  println(t)

}

$ scalac -d target pm4.scala
$ scala -cp target pm4                    
1
Hello
1.0


Или посмотреть как это реализованно в scala-dbc. Там запросы имеют вид
select (
  "age" is smallint,
  "name" is clob,
  "salary" is int )
from ("persons" naturalJoin "employees")
where (
  "gender" == "M" and
  ("city" == "lausanne" or "city" == "geneva"))
orderBy "age"


Вариант, приведенный тобой работать не будет, т.к. информация о типе стирается, а значит в рантайме A грубо говоря AnyRef (аналог Object)

__>Какой вообще формат у case можеть быть в различных случаях? Я видел: case x: String, case </element> и др. Но общей сути так и не понял. В ScalaReferences написано что-то типа case e1 => p1 — ну и что такое e1, и каким оно может быть в разных ситуациях?


case может иметь несколько видов (при чем части выражения, например vc или v могут опускаться, если нет необходимости работать с сами заматченым объектом, а например только с параметрами ca1, ca2)

case vc: CaseClass(ca1, ca2) — где параметры конструктора исползовавшиеся при конструировании case классов (специальный вид классов)
case v: ClassName — фактически оптимизированный instanceOf с последующим преведением и присвоением val v = matchVal.asInstanceOf[ClassName]
scala> class U(val v: int) {}
scala> val m=new U(1)
m: U = U@5a936b
scala> m match { case l: U => println("" + l + " " + m) }
line6$object$$iw$$iw$U@5a936b line6$object$$iw$$iw$U@5a936b

Есть еще конструкции с экстраторами и анонимными фукнциями.

Но основное надо помнить: информации о типах нет (erasure как в java) по этому весь match работает только над объектами и константами.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.