2016-08-29 2 views
0

Я хотел бы иметь возможность определить функцию, которая принимает поле класса case имя в качестве параметра и использует значение этого поля. Рассмотрим приведенный ниже код:Получение значения поля класса case с помощью val

case class Clock(hour: Int, minute: Int) 

val clock = Clock(3, 55) 
val field = "hour" 
val hour = clock.field    //doesn't work 

Есть ли способ в scala для достижения того, что этот код пытается сделать? Я не смог найти этот вопрос в S/O, поэтому я предполагаю, что это может быть не то, что я должен пытаться сделать. Если это правда, почему это так?

ответ

1

С некоторыми основными редактированием текста/макросами можно просто ввести функцию, например,

def clock_field(clock: Clock, field: String): Any = { 
    field match { 
    case "hour" => clock.hour 
    case "minute" => clock.minute 
    } 
} 

Моей Скала не является достаточно сильной, чтобы сделать это красиво, но любой текстовый редактор, который позволяет макросы должны сделать генерации тех легко.

0

Здесь вы можете попробовать Dynamic. Рассмотрим пример ниже:

class Clock extends Dynamic { 
    def selectDynamic(field: String) = field 
} 

scala> val clock = new Clock 
clock: Clock = [email protected] 

scala> clock.foo 
res37: String = foo 

scala> clock.selectDynamic("foo") 
res38: String = foo 

Таким образом, вы можете, например, согласование использования шаблона в selectDynamic для выбора поля.

Смежные вопросы