Вопросы по Scala от программиста на C ++ (structs и stl) - PullRequest
8 голосов
/ 19 декабря 2010

У меня проблемы с переводом структур данных C ++ в Scala. Scala действительно отличается от C ++, но мне он очень нравится. У меня есть следующий фрагмент кода в C ++:

struct Output
{
    double point;
    double solution[6];
};

struct Coeff
{
    double rcont1[6];
    double rcont2[6];
    double rcont3[6];
    double rcont4[6];
    double rcont5[6];
    double rcont6[6];
};
std::list<Output> output;
std::list<Coeff> coeff;

Теперь я заполняю список в цикле while данными

while(n<nmax) {
    if step successfull
         Output out;
         out.point = some values;
         out.solution[0] = some value;
         output.push_back(out);
}

Я пытался создать простой класс в Scala для хранения данных.

class Output
{
    var point: Double
    var solution: Array[Double] = new Array(6)
}

Но это не работает, так как точка не инициализирована. Это можно обойти? Я просто хочу определить переменную, но не инициализировать ее.

Еще одна быстрая вещь. Я ищу эквивалент stl :: lower_bound.

Is находит правильную позицию для вставки элемента в отсортированный контейнер для поддержания порядка.

Спасибо за помощь новичку в Scala

Ответы [ 3 ]

4 голосов
/ 19 декабря 2010

Почему вы не хотите его инициализировать?Для эффективности?Я боюсь, что JVM не позволяет вам избежать случайного мусора в ваших переменных, основанного на том, что было там изначально.Так как вы все равно должны инициализировать его, почему бы не указать, какое значение у вас «неинициализировано»?

class Output {
  var point = 0.0
  var solution = new Array[Double](6)
}

(Вы можете использовать Double.NaN и проверить на point.isNaN, если позже вам нужно будет проверитьзначение было инициализировано или нет.)

Вы можете использовать _ в качестве инициализации по умолчанию, но если вы не используете его в общем коде:

class Holder[T] {
  var held: T = _
}

, тогда вы просто затеняетезначение действительно будет установлено в.(Или вы объявляете: «Мне действительно все равно, что здесь происходит, это может быть что угодно» - что может быть полезным.)

3 голосов
/ 19 декабря 2010

Трудно эффективно перевести, так как вы оставили много неизвестных скрытых за псевдокодом, но я бы выступил за что-то вроде этого:

// type alias
type Coeff = Seq[Seq[Double]]

// parameters passed to a case class become member fields
case class Output (point: Double, solution: Seq[Double])

val outputs = (0 to nmax) map { n =>
    Output(generatePoint(n), generateSolution(n))
}

Если вы можете конкретизировать ваш пример кодачуть полнее, я смогу дать лучший перевод.

3 голосов
/ 19 декабря 2010

Я только что нашел ответ на инициализацию:

class Output
{
    var point: Double = _
    var solution: Array[Double] = Array(6)
}

У Puh Scala есть много синтаксиса, к которому можно привыкнуть: -)

У кого-нибудь есть решение для нижнего эквивалента?

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