سؤال

بالنسبة لشخص ليس لديه خلفية علمية، ما هو لامدا في عالم علوم الكمبيوتر؟

هل كانت مفيدة؟

المحلول

لامدا يأتي من حساب التفاضل والتكامل لامدا ويشير إلى وظائف مجهولة في البرمجة.

لماذا هذا رائع؟يسمح لك بكتابة وظائف سريعة الرمي دون تسميتها.كما أنه يوفر طريقة لطيفة لكتابة الإغلاقات.وبهذه القوة يمكنك القيام بأشياء مثل هذه.

بايثون

def adder(x):
    return lambda y: x + y
add5 = adder(5)
add5(1)
6

كما ترون من مقتطف بايثون، تأخذ أداة إضافة الدالة وسيطة x، وترجع دالة مجهولة، أو لامدا، تأخذ وسيطة أخرى y.تتيح لك هذه الوظيفة المجهولة إنشاء وظائف من الوظائف.هذا مثال بسيط، ولكن يجب أن ينقل قوة لامدا وعمليات الإغلاق.

أمثلة في لغات أخرى

بيرل 5

sub adder {
    my ($x) = @_;
    return sub {
        my ($y) = @_;
        $x + $y
    }
}

my $add5 = adder(5);
print &$add5(1) == 6 ? "ok\n" : "not ok\n";

جافا سكريبت

var adder = function (x) {
    return function (y) {
        return x + y;
    };
};
add5 = adder(5);
add5(1) == 6

جافا سكريبت (ES6)

const adder = x => y => x + y;
add5 = adder(5);
add5(1) == 6

مخطط

(define adder
    (lambda (x)
        (lambda (y)
           (+ x y))))
(define add5
    (adder 5))
(add5 1)
6

C#3.5 أو أعلى

Func<int, Func<int, int>> adder = 
    (int x) => (int y) => x + y; // `int` declarations optional
Func<int, int> add5 = adder(5);
var add6 = adder(6); // Using implicit typing
Debug.Assert(add5(1) == 6);
Debug.Assert(add6(-1) == 5);

// Closure example
int yEnclosed = 1;
Func<int, int> addWithClosure = 
    (x) => x + yEnclosed;
Debug.Assert(addWithClosure(2) == 3);

سويفت

func adder(x: Int) -> (Int) -> Int{
   return { y in x + y }
}
let add5 = adder(5)
add5(1)
6

بي أتش بي

$a = 1;
$b = 2;

$lambda = function () use (&$a, &$b) {
    echo $a + $b;
};

echo $lambda();

هاسكل

(\x y -> x + y) 

جافا يرى هذا المشنور

// The following is an example of Predicate : 
// a functional interface that takes an argument 
// and returns a boolean primitive type.

Predicate<Integer> pred = x -> x % 2 == 0; // Tests if the parameter is even.
boolean result = pred.test(4); // true

لوا

adder = function(x)
    return function(y)
        return x + y
    end
end
add5 = adder(5)
add5(1) == 6        -- true

كوتلين

val pred = { x: Int -> x % 2 == 0 }
val result = pred(4) // true

روبي

تختلف روبي قليلاً من حيث أنه لا يمكنك استدعاء لامدا باستخدام نفس بناء الجملة تمامًا مثل استدعاء دالة، ولكنها لا تزال تحتوي على لامدا.

def adder(x)
  lambda { |y| x + y }
end
add5 = adder(5)
add5[1] == 6

روبي هي روبي، هناك اختصار لـ lambdas، لذا يمكنك تعريفها adder من هنا:

def adder(x)
  -> y { x + y }
end

نصائح أخرى

لامدا هي نوع من الوظائف، محددة في السطر.جنبا إلى جنب مع لامدا، عادة ما يكون لديك أيضًا نوع من المتغيرات التي يمكن أن تحتوي على إشارة إلى دالة، أو لامدا أو غير ذلك.

على سبيل المثال، إليك جزء من التعليمات البرمجية في لغة C# لا يستخدم رمز lambda:

public Int32 Add(Int32 a, Int32 b)
{
    return a + b;
}

public Int32 Sub(Int32 a, Int32 b)
{
    return a - b;
}

public delegate Int32 Op(Int32 a, Int32 b);

public void Calculator(Int32 a, Int32 b, Op op)
{
    Console.WriteLine("Calculator: op(" + a + ", " + b + ") = " + op(a, b));
}

public void Test()
{
    Calculator(10, 23, Add);
    Calculator(10, 23, Sub);
}

يؤدي هذا إلى استدعاء الحاسبة، ولا يمرر رقمين فقط، ولكن الطريقة التي يتم الاتصال بها داخل الحاسبة للحصول على نتائج الحساب.

في C# 2.0 حصلنا على أساليب مجهولة، والتي تختصر الكود أعلاه إلى:

public delegate Int32 Op(Int32 a, Int32 b);

public void Calculator(Int32 a, Int32 b, Op op)
{
    Console.WriteLine("Calculator: op(" + a + ", " + b + ") = " + op(a, b));
}

public void Test()
{
    Calculator(10, 23, delegate(Int32 a, Int32 b)
    {
        return a + b;
    });
    Calculator(10, 23, delegate(Int32 a, Int32 b)
    {
        return a - b;
    });
}

ثم في C# 3.0 حصلنا على lambdas مما يجعل الكود أقصر:

public delegate Int32 Op(Int32 a, Int32 b);

public void Calculator(Int32 a, Int32 b, Op op)
{
    Console.WriteLine("Calculator: op(" + a + ", " + b + ") = " + op(a, b));
}

public void Test()
{
    Calculator(10, 23, (a, b) => a + b);
    Calculator(10, 23, (a, b) => a - b);
}

تشير إلى حساب التفاضل والتكامل لامدا, ، وهو نظام رسمي يحتوي فقط على تعبيرات لامدا، والتي تمثل دالة تأخذ دالة للوسيط الوحيد لها وترجع دالة.جميع الوظائف في حساب التفاضل والتكامل لامدا هي من هذا النوع، أي، λ : λ → λ.

استخدمت Lisp مفهوم lambda لتسمية حرفيات الدالة المجهولة.تمثل لامدا دالة تأخذ وسيطتين، x وy، وترجع منتجهما:

(lambda (x y) (* x y)) 

يمكن تطبيقه في السطر مثل هذا (يتم تقييمه لـ 50):

((lambda (x y) (* x y)) 5 10)

اسم "لامدا" هو مجرد قطعة أثرية تاريخية.كل ما نتحدث عنه هو تعبير قيمته دالة.

مثال بسيط (باستخدام Scala للسطر التالي) هو:

args.foreach(arg => println(arg))

حيث الحجة ل foreach الطريقة هي تعبير عن وظيفة مجهولة.السطر أعلاه يشبه إلى حدٍ ما كتابة شيء كهذا (ليس رمزًا حقيقيًا تمامًا، لكنك ستفهم الفكرة):

void printThat(Object that) {
  println(that)
}
...
args.foreach(printThat)

باستثناء أنك لست بحاجة إلى الاهتمام بما يلي:

  1. الإعلان عن الوظيفة في مكان آخر (وضرورة البحث عنها عند إعادة زيارة الكود لاحقًا).
  2. تسمية شيء تستخدمه مرة واحدة فقط.

بمجرد أن تعتاد على استخدام القيم، فإن الاضطرار إلى الاستغناء عنها يبدو أمرًا سخيفًا مثل مطالبتك بتسمية كل تعبير، مثل:

int tempVar = 2 * a + b
...
println(tempVar)

بدلاً من مجرد كتابة التعبير حيث تحتاج إليه:

println(2 * a + b)

يختلف التدوين الدقيق من لغة إلى أخرى؛اليونانية ليست مطلوبة دائما!؛-)

حساب التفاضل والتكامل لامدا هو نظرية رياضية ثابتة للاستبدال.في الرياضيات المدرسية يرى المرء على سبيل المثال x+y=5 يقترن x−y=1.إلى جانب طرق التعامل مع المعادلات الفردية، من الممكن أيضًا تجميع المعلومات من هاتين المعادلتين معًا، بشرط إجراء عمليات الاستبدال عبر المعادلات بشكل منطقي.يقوم حساب Lambda بتدوين الطريقة الصحيحة للقيام بهذه البدائل.

بشرط y = x−1 هي إعادة ترتيب صحيحة للمعادلة الثانية، وهذا: λ y = x−1 يعني وظيفة استبدال الرموز x−1 للرمز y.الآن تخيل التقديم λ y لكل حد في المعادلة الأولىإذا كان مصطلح y ثم قم بإجراء الاستبدال.وإلا فلا تفعل شيئًا.إذا قمت بذلك على الورق سترى كيفية تطبيق ذلك λ y سوف تجعل المعادلة الأولى قابلة للحل.

هذه إجابة بدون أي علوم كمبيوتر أو برمجة.

أبسط مثال برمجة يمكنني التفكير فيه يأتي من http://en.wikipedia.org/wiki/Joy_(programming_language)#How_it_works:

فيما يلي كيف يمكن تعريف وظيفة Square بلغة برمجة ضرورية (ج):

int square(int x)
{
    return x * x;
}

المتغير x هو معلمة رسمية يتم استبدالها بالقيمة الفعلية المراد تربيتها عند استدعاء الوظيفة.في اللغة الوظيفية (المخطط) ، سيتم تعريف نفس الوظيفة:

(define square
  (lambda (x) 
    (* x x)))

هذا يختلف بطرق عديدة ، لكنه لا يزال يستخدم المعلمة الرسمية X بنفس الطريقة.


تمت الإضافة: http://imgur.com/a/XBHub

lambda

مبالغة في التبسيط قليلاً:دالة لامدا هي دالة يمكن تمريرها إلى وظائف أخرى ويمكن الوصول إليها منطقيًا.

في C#، غالبًا ما يتم تجميع بناء جملة lambda إلى طرق بسيطة بنفس طريقة المفوضين المجهولين، ولكن يمكن أيضًا تقسيمها وقراءة منطقها.

على سبيل المثال (في C#3):

LinqToSqlContext.Where( 
    row => row.FieldName > 15 );

يمكن لـ LinqToSql قراءة هذه الوظيفة (x > 15) وتحويلها إلى SQL الفعلي لتنفيذها باستخدام أشجار التعبير.

يصبح البيان أعلاه:

select ... from [tablename] 
where [FieldName] > 15      --this line was 'read' from the lambda function

وهذا يختلف عن الطرق العادية أو المندوبين المجهولين (والتي هي مجرد مترجم سحري حقًا) لأنها لا يمكن أن تكون كذلك يقرأ.

لا يمكن تجميع كافة الأساليب في C# التي تستخدم بناء جملة lambda إلى أشجار التعبير (على سبيل المثال.وظائف لامدا الفعلية).على سبيل المثال:

LinqToSqlContext.Where( 
    row => SomeComplexCheck( row.FieldName ) );

الآن لا يمكن قراءة شجرة التعبير - لا يمكن تقسيم SomeComplexCheck.سيتم تنفيذ عبارة SQL بدون المكان، وسيتم تنفيذ كل صف في البيانات SomeComplexCheck.

لا ينبغي الخلط بين وظائف Lambda والطرق المجهولة.على سبيل المثال:

LinqToSqlContext.Where( 
    delegate ( DataRow row ) { 
        return row.FieldName > 15; 
    } );

يحتوي هذا أيضًا على وظيفة "مضمنة"، ولكن هذه المرة مجرد مترجم سحري - سيقوم مترجم C# بتقسيم ذلك إلى طريقة مثيل جديدة باسم تم إنشاؤه تلقائيًا.

لا يمكن قراءة الأساليب المجهولة، وبالتالي لا يمكن ترجمة المنطق كما هو الحال مع وظائف لامدا.

يعجبني شرح Lambdas في هذا المقال: تطور LINQ وأثره على تصميم لغة C#.لقد كان الأمر منطقيًا جدًا بالنسبة لي لأنه يُظهر عالمًا حقيقيًا لـ Lambdas ويبنيه كمثال عملي.

شرحهم السريع:تعد Lambdas طريقة للتعامل مع التعليمات البرمجية (الوظائف) كبيانات.

مثال على لامدا في روبي هو كما يلي:

hello = lambda do
    puts('Hello')
    puts('I am inside a proc')
end

hello.call

سيولد الإخراج التالي:

Hello
I am inside a proc

@Brian أستخدم lambdas طوال الوقت في C# وفي LINQ والمشغلين غير LINQ.مثال:

string[] GetCustomerNames(IEnumerable<Customer> customers)
 { return customers.Select(c=>c.Name);
 }

قبل C#، كنت أستخدم وظائف مجهولة في JavaScript لرد الاتصال بوظائف AJAX، قبل صياغة مصطلح Ajax:

getXmlFromServer(function(result) {/*success*/}, function(error){/*fail*/});

الشيء المثير للاهتمام في بناء جملة lambda الخاص بـ C# هو أنه لا يمكن استنتاج نوعها بمفردها (على سبيل المثال، لا يمكنك كتابة var foo = (x,y) => x * y) ولكن اعتمادًا على النوع الذي تنتمي إليه سيتم تجميعها كمفوضين أو أشجار بناء جملة مجردة تمثل التعبير (وهي الطريقة التي يقوم بها مصممو كائنات LINQ بسحرهم "المتكامل اللغة").

يمكن أيضًا تمرير Lambdas في LISP إلى مشغل عروض الأسعار ثم اجتيازها كقائمة من القوائم.يتم تصنيع بعض وحدات الماكرو القوية بهذه الطريقة.

تمت الإجابة على هذا السؤال رسميًا بشكل كبير، لذا لن أحاول إضافة المزيد حول هذا الموضوع.

وببساطة شديدة، غير رسمي كلمات لشخص لا يعرف سوى القليل جدًا أو لا يعرف شيئًا عن الرياضيات أو البرمجة، أود أن أشرحها على أنها "آلة" أو "صندوق" صغير يأخذ بعض المدخلات، ويقوم ببعض الأعمال وينتج بعض المخرجات، وليس له اسم محدد، لكننا نعرف أين إنه كذلك وبهذه المعرفة فقط نستخدمها.

من الناحية العملية، بالنسبة لشخص يعرف ما هي الوظيفة، أود أن أخبره أنها وظيفة ليس لها اسم، وعادةً ما يتم وضعها في نقطة في الذاكرة يمكن استخدامها فقط من خلال الإشارة إلى تلك الذاكرة (عادةً عن طريق استخدام متغير - إذا سمعوا عن مفهوم مؤشرات الوظيفة، فسأستخدمها كمفهوم مشابه) - تغطي هذه الإجابة الأساسيات الجميلة (بدون ذكر عمليات الإغلاق وما إلى ذلك) ولكن يمكن للمرء الحصول على هذه النقطة بسهولة.

يمكنك اعتبارها وظيفة مجهولة المصدر - إليك بعض المعلومات الإضافية: ويكيبيديا - وظيفة مجهولة

فقط لأنني لا أستطيع رؤية مثال C++ 11 هنا، سأستمر بنشر هذا المثال الجميل من هنا.بعد البحث، هذا هو أوضح مثال محدد للغة يمكن أن أجده.

مرحبًا، لامداس، الإصدار 1

template<typename F>

void Eval( const F& f ) {
        f();
}
void foo() {
        Eval( []{ printf("Hello, Lambdas\n"); } );
}

مرحبًا لامداس، الإصدار 2:

void bar() {
    auto f = []{ printf("Hello, Lambdas\n"); };
    f();
}

أواجه مشكلة في الالتفاف حول تعبيرات lambda لأنني أعمل في Visual FoxPro، الذي يحتوي على استبدال الماكرو ووظائف ExecScript{} وEvaluate()، والتي يبدو أنها تخدم نفس الغرض تقريبًا.

? Calculator(10, 23, "a + b")
? Calculator(10, 23, "a - b");

FUNCTION Calculator(a, b, op)
RETURN Evaluate(op)

إحدى الفوائد المحددة لاستخدام lambdas الرسمية هي (أفترض) التحقق من وقت الترجمة:لن يعرف Fox ما إذا كنت قد أخطأت في كتابة السلسلة النصية أعلاه حتى يحاول تشغيلها.

وهذا مفيد أيضًا للتعليمات البرمجية المستندة إلى البيانات:يمكنك تخزين إجراءات كاملة في حقول المذكرة في قاعدة البيانات ومن ثم تقييمها في وقت التشغيل.يتيح لك هذا تعديل جزء من التطبيق دون الوصول فعليًا إلى المصدر.(لكن هذا موضوع آخر تمامًا.)

بالنسبة لشخص ليس لديه خلفية علمية، ما هو لامدا في عالم علوم الكمبيوتر؟

سأوضح ذلك بشكل حدسي خطوة بخطوة في أكواد بايثون البسيطة والقابلة للقراءة.

باختصار، لامدا هي مجرد وظيفة مجهولة ومضمنة.

لنبدأ من المهمة لنفهم lambdas كطالب جديد مع خلفية في الحساب الأساسي.

مخطط التعيين هو "الاسم = القيمة"، راجع:

In [1]: x = 1
   ...: y = 'value'
In [2]: x
Out[2]: 1
In [3]: y
Out[3]: 'value'

"x" و"y" هي أسماء و1 و"قيمة" هي قيم.جرب وظيفة في الرياضيات

In [4]: m = n**2 + 2*n + 1
NameError: name 'n' is not defined

تقارير الأخطاء،
لا يمكنك كتابة عملية رياضية مباشرة كرمز، فيجب تعريف "n" أو تعيين قيمة لها.

In [8]: n = 3.14
In [9]: m = n**2 + 2*n + 1
In [10]: m
Out[10]: 17.1396

إنه يعمل الآن، ماذا لو أصررت على الجمع بين الخطين المنفصلين في خط واحد.جاءكم lambda

In [13]: j = lambda i: i**2 + 2*i + 1
In [14]: j
Out[14]: <function __main__.<lambda>>

لم يتم الإبلاغ عن أي أخطاء.

هذه نظرة سريعة على lambda, يمكنك من كتابة دالة في سطر واحد كما تفعل في الرياضيات على الكمبيوتر مباشرة.

سنرى ذلك لاحقا.

دعونا نواصل التعمق في "المهمة".

كما هو موضح أعلاه، رمز يساوي = يعمل مع نوع البيانات البسيطة (1 و'القيمة') والتعبير البسيط (n**2 + 2*n + 1).

جرب هذا:

In [15]: x = print('This is a x')
This is a x
In [16]: x
In [17]: x = input('Enter a x: ')
Enter a x: x

إنه يعمل مع العبارات البسيطة، ويوجد 11 نوعًا منها في لغة بايثون 7.عبارات بسيطة – وثائق بايثون 3.6.3

ماذا عن البيان المركب،

In [18]: m = n**2 + 2*n + 1 if n > 0
SyntaxError: invalid syntax
#or
In [19]: m = n**2 + 2*n + 1, if n > 0
SyntaxError: invalid syntax

جاءكم def تمكينه من العمل

In [23]: def m(n):
    ...:     if n > 0:
    ...:         return n**2 + 2*n + 1
    ...:
In [24]: m(2)
Out[24]: 9

تادا، قم بتحليلها، 'm' هو الاسم، 'n**2 + 2*n + 1' هو القيمة.: هو البديل من '='.
تجده، لو فقط للفهم، كل شيء يبدأ من التكليف وكل شيء تكليف.

الآن عد إلى lambda, لدينا دالة اسمها "m"

يحاول:

In [28]: m = m(3)
In [29]: m
Out[29]: 16

هناك اسمان لـ "m" هنا، الوظيفة m لديه بالفعل اسم، مكررة.

تنسيقه مثل:

In [27]: m = def m(n):
    ...:         if n > 0:
    ...:             return n**2 + 2*n + 1
    SyntaxError: invalid syntax

إنها ليست استراتيجية ذكية، لذا تقارير الأخطاء

يتعين علينا حذف واحد منهم، وتعيين وظيفة بدون اسم.

m = lambda n:n**2 + 2*n + 1

يطلق عليها "وظيفة مجهولة"

ختاماً،

  1. lambda في دالة مضمنة تمكنك من كتابة دالة في خط مستقيم واحد كما هو الحال في الرياضيات
  2. lambda مجهول

أتمنى أن يساعدك هذا.

إنها وظيفة ليس لها اسم.على سبيل المثال.في C# يمكنك استخدامه

numberCollection.GetMatchingItems<int>(number => number > 5);

لإرجاع الأرقام الأكبر من 5.

number => number > 5

هو جزء لامدا هنا.إنها تمثل دالة تأخذ معلمة (رقم) وترجع قيمة منطقية (رقم > 5).تستخدم طريقة GetMatchingItems لامدا هذه على جميع العناصر الموجودة في المجموعة وتقوم بإرجاع العناصر المطابقة.

في Javascript، على سبيل المثال، يتم التعامل مع الوظائف على أنها نفس النوع المختلط مثل أي شيء آخر (int, string, float, bool).على هذا النحو، يمكنك إنشاء وظائف بسرعة، وتعيينها للأشياء، ومعاودة الاتصال بها لاحقًا.إنه مفيد ولكن ليس شيئًا تريد الإفراط في استخدامه وإلا ستربك كل من عليه الحفاظ على الكود الخاص بك من بعدك ...

هذه بعض التعليمات البرمجية التي كنت ألعب بها لمعرفة مدى عمق حفرة الأرانب هذه:

var x = new Object;
x.thingy = new Array();
x.thingy[0] = function(){ return function(){ return function(){ alert('index 0 pressed'); }; }; }
x.thingy[1] = function(){ return function(){ return function(){ alert('index 1 pressed'); }; }; }
x.thingy[2] = function(){ return function(){ return function(){ alert('index 2 pressed'); }; }; }

for(var i=0 ;i<3; i++)
    x.thingy[i]()()();

في سياق علوم الكمبيوتر، تعتبر دالة لامدا مفهومًا رياضيًا مجردًا يعالج مشكلة التقييم الرمزي للتعبيرات الرياضية.في هذا السياق، تكون دالة لامدا هي نفسها دالة مصطلح لامدا.

لكن في لغات البرمجة الأمر مختلف.إنها قطعة من التعليمات البرمجية التي تم الإعلان عنها "في مكانها الصحيح"، ويمكن تمريرها على أنها "مواطن من الدرجة الأولى".يبدو أن هذا المفهوم مفيد بحيث دخل إلى جميع لغات البرمجة الحديثة الشائعة تقريبًا (انظر وظائف لامدا في كل مكان بريد).

حصلت عليه أيضا.لقد جربته في JS مع هذا:

var addAndMult = function(x) {
        return (function(y) {
            return (function(z) {
                return (x+y)*z; 
                });
            });
        };

يضيف 2 إلى 4 ثم يضرب النتيجة بـ 6.ومع ذلك أجد صعوبة في القراءة في بعض الأحيان :(

لقد قمت أيضًا بإنشاء وظيفة forEach مثيرة للاهتمام:

var forEach = function(arr) {
            return (function(x) {
            for (var i=0; arr[i]; i++) {
                 x(arr[i]);
             }
        });
    }

forEach([1,2,3,4,5])(console.log);

ستقوم هذه الطريقة بتكرار المصفوفة وتنفيذ إجراء - في حالة الطباعة على وحدة التحكم.الآن أفهم أيضًا سبب قوة Labmdas.

في برمجة الكمبيوتر، لامدا هي قطعة من التعليمات البرمجية (بيان أو تعبير أو مجموعة منها) والتي تأخذ بعض الوسائط من مصدر خارجي.ويجب ألا تكون دائمًا وظيفة مجهولة المصدر - فلدينا العديد من الطرق لتنفيذها.

لدينا فصل واضح بين التعبيرات والعبارات والوظائف، وهو ما لا يمتلكه علماء الرياضيات.

كلمة "وظيفة" في البرمجة مختلفة أيضًا - فلدينا "الوظيفة عبارة عن سلسلة من الخطوات التي يجب القيام بها" (من الكلمة اللاتينية "أداء").في الرياضيات يتعلق الأمر بالارتباط بين المتغيرات.

تحاول اللغات الوظيفية أن تكون مشابهة لصيغ الرياضيات قدر الإمكان، كما أن كلماتها تعني نفس الشيء تقريبًا.ولكن في لغات البرمجة الأخرى لدينا الأمر مختلف.

أ Lambda Function, ، أو أ Small Anonymous Function, ، عبارة عن كتلة قائمة بذاتها من الوظائف التي يمكن تمريرها واستخدامها في التعليمات البرمجية الخاصة بك.لدى Lambda أسماء مختلفة في لغات البرمجة المختلفة – Lambda في بايثون و كوتلين, Closure في سويفت, ، أو Block في ج و ج موضوعية.على الرغم من أن معنى لامدا مشابه تمامًا لهذه اللغات، إلا أنه يحتوي على اختلافات طفيفة في بعض الأحيان.

دعونا نرى كيف يعمل Lambda (Closure) في Swift 4.2 باستخدام طريقةsorted() - من الوظيفة العادية حتى أقصر تعبير:

let coffee: [String] = ["Cappuccino", "Espresso", "Latte", "Ristretto"]

1.وظيفة عادية

func backward(_ n1: String, _ n2: String) -> Bool {
    return n1 > n2
}
var reverseOrder = coffee.sorted(by: backward)


// RESULT: ["Ristretto", "Latte", "Espresso", "Cappuccino"]

2.تعبير الإغلاق

reverseOrder = coffee.sorted(by: { (n1: String, n2: String) -> Bool in
    return n1 > n2
})

3.تعبير الإغلاق المضمن

reverseOrder = coffee.sorted(by: { (n1: String, n2: String) -> Bool in return n1 > n2 } )

4.استنتاج النوع من السياق

reverseOrder = coffee.sorted(by: { n1, n2 in return n1 > n2 } )

5.العوائد الضمنية من عمليات إغلاق التعبير المفرد

reverseOrder = coffee.sorted(by: { n1, n2 in n1 > n2 } )

6.أسماء الوسيطات المختصرة

reverseOrder = coffee.sorted(by: { $0 > $1 } )

// $0 and $1 are closure’s first and second String arguments.

7.طرق المشغل

reverseOrder = coffee.sorted(by: >)

// RESULT: ["Ristretto", "Latte", "Espresso", "Cappuccino"]

أتمنى أن يساعدك هذا.

تمت الإجابة على السؤال بشكل كامل، ولا أريد الخوض في التفاصيل.أريد مشاركة الاستخدام عند كتابة الحساب العددي في الصدأ.

يوجد مثال على لامدا (وظيفة مجهولة)

let f = |x: f32| -> f32 { x * x - 2.0 };
let df = |x: f32| -> f32 { 2.0 * x };

عندما كنت أكتب وحدة من طريقة نيوتن-رافسون، تم استخدامها كمشتق من الدرجة الأولى والثانية.(إذا كنت تريد معرفة ما هي طريقة نيوتن-رافسون، يرجى زيارة "https://en.wikipedia.org/wiki/Newton%27s_method".

الإخراج على النحو التالي

println!("f={:.6}      df={:.6}", f(10.0), df(10.0))

f=98.000000       df=20.000000

تخيل أن لديك مطعمًا به خيار التوصيل ولديك طلب يجب تنفيذه في أقل من 30 دقيقة.النقطة المهمة هي أن العملاء عادةً لا يهتمون إذا قمت بإرسال طعامهم بالدراجة أو بسيارة أو حافي القدمين طالما أنك تحافظ على الوجبة دافئة ومقيدة.لذلك دعونا نحول هذا المصطلح إلى Javascript باستخدام وظائف نقل مجهولة ومحددة.

أدناه حددنا طريقة التسليم لدينا، ويعرف أيضًا باسم أننا نحدد اسمًا لوظيفة:

// ES5 
var food = function withBike(kebap, coke) {
return (kebap + coke); 
};

ماذا لو استخدمنا وظائف السهم/لامدا لإنجاز هذا النقل:

// ES6    
const food = (kebap, coke) => { return kebap + coke };

ترى أنه لا يوجد فرق بالنسبة للعميل ولا يضيع الوقت في التفكير في كيفية إرسال الطعام.فقط ارسلها.

راجع للشغل، أنا لا أوصي بالكباب مع فحم الكوك وهذا هو السبب في أن الرموز العليا سوف تعطيك أخطاء.استمتع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top