Доступ к члену класса из первоклассной функции - PullRequest
3 голосов
/ 18 мая 2010

У меня есть класс case, который принимает список функций:

case class A(q:Double, r:Double, s:Double, l:List[(Double)=>Double])

У меня определено более 20 функций. Некоторые из этих функций имеют свои собственные параметры, а некоторые из них также используют значения q, r и s из класса case. Два примера:

def f1(w:Double) = (d:Double) => math.sin(d) * w
def f2(w:Double, q:Double) = (d:Double) => d * q * w

Проблема в том, что мне нужно дважды ссылаться на q, r и s при создании экземпляра класса дела:

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 ]

5 голосов
/ 18 мая 2010

Если 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 голосов
/ 18 мая 2010

Есть очевидная декларация 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, а не просто создавать его в контексте A.

Наконец, вы можете сделать функции частичными функциями. Первая группа параметров будет такой, как они есть, но будет добавлена ​​вторая группа, которая имеет тип A.

1 голос
/ 18 мая 2010

Одной простой идеей было бы изменить функцию так, чтобы она брала список функций, которые принимают 3 двойных (q, r и s) и возвращают функцию от двойного к двойному. Таким образом, те функции, которым нужно любое из значений, могут использовать их, а другие просто игнорируют их все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...