Почему не делает C#, имеют лексически вложенные функции?

Сначала вы знаете, что в database.js существует этот код:

module.exports = function (object) {
  // . . .
  // some thing on object
  return object;
};

, когда вам требуется этот файл JS, вы можете отправить данные объекта функции выше (пустые или не пустые)

[111 ]
12
задан Greg Hewgill 23 February 2009 в 02:52
поделиться

2 ответа

На самом деле C# имеет точно это.

double sqrt(double x) {
    var goodEnough = new Func<double, bool>(guess =>
        Math.Abs(square(guess) - x) < 0.001
    );
    var improve = new Func<double, double>(guess =>
        average(guess, x / guess)
    );
    var sqrtIter = default(Func<double, double>);
    sqrtIter = new Func<double, double>(guess =>
        goodEnough(guess) ? guess : sqrtIter(improve(guess))
    );
    return sqrtIter(1.0);
}
36
ответ дан 2 December 2019 в 03:25
поделиться

Как сказанная Справедливость, можно сделать это с C# 3.5 и лямбдами; если бы у Вас есть C# 2.0, можно использовать анонимные функции, хотя это было бы несколько менее сексуально:

double sqrt(double x) {
    Func<double, bool> goodEnough = delegate(double guess) {
        return Math.Abs(square(guess) - x) < 0.001;
    };
    Func<double, double> improve = delegate(double guess) {
        return average(guess, x / guess);
    };
    Func<double, double> sqrtIter = null;
    sqrtIter = delegate(double guess) {
        return goodEnough(guess) ? guess : sqrtIter(improve(guess));
    };
    return sqrtIter(1.0);
}

Править: Я забыл, Func не определяется в C# 2.0, таким образом, необходимо определить его сами:

 public delegate TResult Func<T, TResult>(T guess);
8
ответ дан 2 December 2019 в 03:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: