Доступ к члену класса из первоклассной функции

У меня есть класс 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) и возвращают функцию от двойного к двойному. Таким образом, те функции, которым нужно любое из значений, могут использовать их, а другие просто игнорируют их все.

Другие вопросы по тегам