Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
Cześć :)
Powiedźcie mi proszę jaki jest sens używania funkcji lambda? Coś musi to mieć na celu, skoro wprowadzili to w C++ i Javie. Dlaczego ja uważam, że to nie ma sensu?
takiej funkcji i tak nie można ponownie wywołać, a to jest właśnie najistotniejsze zastosowanie funkcji.
nie wiem dlaczego upierac przy utrudnianiu składni, skoro zamiast pisać funkcję lambda można po prostu ten kawałem kodu wpisać w "to miejsce".
Pozdrawiam :)
takiej funkcji i tak nie można ponownie wywołać, a to jest właśnie najistotniejsze zastosowanie funkcji.
Mozna jak sie przypisze do zmiennych.
Glowne zastosowanie lambd to tak zwane higher-order functions, czyli funkcje przyjmujace (badz zwracajace) inne funkcji. Na przyklad cale <algorithm>
nie wiem dlaczego upierac przy utrudnianiu składni, skoro zamiast pisać funkcję lambda można po prostu ten kawałem kodu wpisać w "to miejsce".
Nie mozna, pisanie lambdy jest duzo szybsze i bardziej przedstawia intencje autora.
W niektorych jezykach masz jeszcze dodatkowe smaczki zwiazane z lambdami, jak na przyklad rozwalanie ich na drzewa wyrazen w C#,
W niektorych przypadkach ciezko jest uzyc czegos innego niz lambda, bo potrzebujemy aktualnego 'kontekstu' (ewentualnie jego czesci).
Ad 1. Przeważnie takie funkcje są wywoływany tylko w jednym miejscu całego programu, albo na przykład przypisywane od razu do tablicy funkcji.
Ad 2. Pokaż jak wstawisz bezpośrednio tu:
@mielony źle na to patrzysz. Skokiem cywilizacyjnym nie jest sam fakt że mozesz napisać sobie funkcję anonimową - lambdę. Jest nim fakt że możesz używać funkcji jako obiektów 1 klasy. To znaczy możesz zrobić API które wymaga funkcji jako parametrów. To jest dopiero coś! Zauważ że jeśli nie masz takiego mechanizmu to musisz się bawić w głupie protezy -> np. tworzyć klasy/interfejsy z jedną metodą które potem przyjmujesz jako parametr. W efekcie użytkownik takiego API musi się bawić w tworzenie nowej klasy tylko po co żeby napisać w niej x < y.
nie wiem dlaczego upierac przy utrudnianiu składni, skoro zamiast pisać funkcję lambda można po prostu ten kawałem kodu wpisać w "to miejsce".
Nie można, gdyby było można to nie byłoby potrzeby pisać lambd. W zasadzie lambdy są właśnie odpowiedzią na problem pisania kodu w miejscu logicznym dla jego wywołania.
Ponadto, za pomocą lambdy jesteś w stanie zrobić (niewiele, ale jednak) więcej niż za pomocą funktorów/funkcji: lambda może przyjmować argumenty tak jak szablon, jednocześnie pomimo tego, że jest zdefiniowana w ciele funkcji, a do tego ma dostęp do składników prywatnych klasy, w której funkcji została zdefiniowana.
zrób sobie typedefa ze wskaźnika na funkcję, i dalej już jest oczywiste.
Usunąć wpis?
Tej operacji nie będzie można cofnąć.
_tmp
_tmp
1
Uzywaj szablonow, na przyklad:
Kopiuj
#include<iostream>usingnamespace std;template<typenameUnaryF>voidcallWith3(UnaryF f){f(3);}intmain(){callWith3([](int i){ cout << i << endl;});return0;}
Generalnie konkretny typ (czy dziwy C++) sa malo istotne, chcesz dostac jakis argument, ktory mozna z czyms tam wywolac i cos konkretnego zwraca, badz nie zwraca nic. Srednio kogokolwiek martwi czy to bedzie funkcja czy jakas klasa z operatorem(), no i nie trzeba tych typedefow pisac.
Mozesz jeszcze uzyc std::function<>, ale to sie wiaze z innymi problemami.
Co wygląda nieźle i ma jedną ciekawą przewagę w stosunku do np. wzkaźnika na funkcję - można wykorzystać zmienne lokalne, pola oraz metody obiektu w ktorym utworzono lambdę. Podobnie w Cpp można się z lambdy odwołać do składowych obiektu gdzie zdefiniowaną mamy lambdę.
Z innych zalet - funkcje jako obiekty pierwszej kategorii - można je przyjmowac jako parametry i zwracać jako wyniki. Pozwala to na np. nieewaluowanie wyrażenie jeżeli nie ma takiej potrzeby:
Kopiuj
format("Log z %s, %s",()->"ewaluacja",()->"ewaluacja",()->"a mnie już nie wywołasz");
Po prostu nie wywołujesz funkcji.
Kolejna sprawa to tworzenie kodu funkcyjnego. Ze wszystkimi jego wadami i zaletami. Do tego dochodzi tworzenie kodu deklaratywnego, a nie imperatywnego, co pozwala na osiągnięcie wysokiej separacji dla poszczególnych elementów.
Podsumowując. Lambdy wprowadzają do kodu elemnty pozwalające na tworzenie zwięzłych, przejrzystych i delkaratywnych konstrukcji. Tym samym kod jest prostszy w testowaniu, utrzymaniu i rozwoju.
Będę musiał sobie przetestować z libc++ w takim razie.
Tak przy okazji:
Kopiuj
int x,y,z;return[=](){return1;};
Tutaj ta lambda nie ma stanu - = kopiuje wyłącznie zmienne użyte wewnątrz lambdy: http://melpon.org/wandbox/permlink/ihyxxmCi7kTe5edk (a gdyby tak nie było to Twój kod by zawierał UB ze względu na niezainicjalizowane zmienne)