Доступ к члену класса из первоклассной функции
У меня есть класс case, который принимает список функций:
case class A(q:Double, r:Double, s:Double, l:List[(Double)=>Double])
У меня более 20 определенных функций. Некоторые из этих функций имеют свои собственные параметры, а некоторые из них также используют q
, r
, а также s
значения из класса дела. Два примера:
def f1(w:Double) = (d:Double) => math.sin(d) * w
def f2(w:Double, q:Double) = (d:Double) => d * q * w
Проблема в том, что мне тогда нужно ссылаться q
, r
, а также s
дважды при создании экземпляра класса case:
A(0.5, 1.0, 2.0, List(f1(3.0), f2(4.0, 0.5))) //0.5 is referenced twice
Я хотел бы иметь возможность создать экземпляр класса следующим образом:
A(0.5, 1.0, 2.0, List(f1(3.0), f2(4.0))) //f2 already knows about q!
Как лучше всего это сделать? Могу ли я определить свои функции по признаку, который расширяет класс case?
РЕДАКТИРОВАТЬ: приложение реального мира имеет 7 членов, а не 3. Доступ к членам имеют только небольшое количество функций. Большинство функций не заботятся о них.
3 ответа
Есть очевидная декларация val:
val a = 0.5
A(a, 1.0, 2.0, List(f1(3.0), f2(4.0, a)))
Иначе, f2
нужна ссылка на А this
, который он будет иметь, если он является членом класса A или конкретного экземпляра A. Отчасти проблема заключается в том, что функции полностью запекаются до создания экземпляра A. Итак, вы должны определить f2
вместо того, чтобы просто создавать его в контексте А.
Наконец, вы можете сделать функции частичными функциями. Первая группа параметров будет такой, какая она есть, но будет добавлена вторая группа, которая имеет тип А.
Если q
в f2
всегда имеет в виду q
в тебе case class
затем один быстрый взлом:
trait TraitA {
def q:Double
def r:Double
def s:Double
def f1(w:Double) = (d:Double) => math.sin(d) * w
def f2(w:Double) = (d:Double) => d * q * w
}
case class A(q:Double, r:Double, s:Double, l:List[(Double)=>Double]=Nil) extends TraitA
val a=new A(0.5, 1.0, 2.0){override val l= List(f1(3.0), f2(4.0))}
Одной простой идеей было бы изменить функцию так, чтобы она брала список функций, которые принимают 3 двойных (q, r и s) и возвращают функцию от двойного к двойному. Таким образом, те функции, которым нужно любое из значений, могут использовать их, а другие просто игнорируют их все.