został nieco rozszerzony od czasu wydania TDPL, ponieważ pure
, jak opisuje TDPL, okazuje się zbyt restrykcyjne, aby mogło być przydatne poza prostymi funkcjami matematycznymi i tym podobnymi. Możesz zajrzeć na the online documentation do obecnej definicji, ale to w zasadzie sprowadza się do tego:
pure
funkcje nie mogą uzyskać dostęp do dowolnego modułu poziomu lub zmienne statyczne, które mogą być zmutowane w trakcie programu (muszą one być const
typów wartości lub immutable
, do których można uzyskać dostęp z funkcji pure
).
pure
funkcje nie mogą wywoływać żadnych funkcji, które nie są pure
.
funkcje nie mogą wykonywać operacji we/wy.
To wszystko. Nie ma żadnych innych ograniczeń. Jednak są tam wymagane dodatkowe ograniczenia, jeśli funkcja pure
zostanie zoptymalizowana tak, że zostanie wywołana tylko raz, nawet jeśli jest używana wielokrotnie w instrukcji. Mianowicie:
- parametry funkcji musi być
immutable
lub niejawnie zamienny do immutable
.
Teoretycznie można rozszerzyć do wymogu, że funkcja jest argumenty musi immutable
lub pośrednio zamiany na immutable
(tak, że funkcja z const
parametry mogą być zoptymalizowane, gdy jest podany immutable
argumentów), ale obecnie nie jest walizka.
Takie funkcje pure
są czasami określane jako "silnie" pure
, natomiast te, których nie można zoptymalizować, będą nazywane "słabo" pure
. TDPL opisuje silnie funkcje pure
. Dodano słabe funkcje pure
, aby zwiększyć użyteczność pure
.
Choć słabo pure
funkcje może zmieniać swoich argumentów, nie mogą zmieniać stan globalny, więc kiedy są one nazywane przez silnie pure
funkcji (co nie może zmienić swoje argumenty), gwarancja, że silnie pure
funkcja zwraca wartość zawsze będzie taka sama dla tych samych argumentów nadal trzyma. Zasadniczo, ponieważ słabe funkcje pure
nie mogą zmutować stanu globalnego, są częścią prywatnego stanu silnie działającej funkcji pure
, z której są wywoływane. Jest więc bardzo zgodne z tym, co opisuje Andrei w sekcji 5.11.1.1 pure
jako pure
Czy w TDPL, z wyjątkiem tego, że prywatny stan funkcji został rozszerzony, aby umożliwić funkcje, które mogą zmienić jego prywatny stan bez zmiany stanu globalnego .
Kolejna ważna sprawa, która została dodana, ponieważ TDPL w odniesieniu do pure
jest wnioskiem funkcji. pure
, i @safe
są wywnioskowane dla funkcji szablonowych (chociaż nie dla normalnych funkcji). Tak więc, jeżeli funkcja szablonowa może być może być pure
, teraz jest ona określona jako . Jego czystość zależy od tego, z czym jest tworzona. Tak więc staje się możliwe używanie pure
z funkcjami szablonowymi, podczas gdy wcześniej, zazwyczaj nie można, ponieważ jeśli zrobiłeś to pure
, to nie działałoby z nieczystą funkcją. Ale jeśli nie zrobił, aby go pure
, to nie można go używać z funkcją pure
, więc był to poważny problem dla pure
. Na szczęście poprawki interferencji atrybutów już teraz. Tak długo, jak funkcja szablonowa jest zgodna z regułami wymienionymi powyżej, gdy jest tworzona, jest to uważane za pure
.
Próbowałem oczyścić tag [tag: pure], ponieważ czasami odnosi się do czystych funkcji wirtualnych, czasami do [czystej] (http://beebole.com/pure/), a czasem do [czystej ] (http://en.wikipedia.org/wiki/Pure_ (programming_language)) - między innymi. Ale nie wiem nic o [tag: d]. Czy możesz potwierdzić, czy moja edycja tagów jest właściwa? Czy [tag: czysto funkcjonalny] działałby na to pytanie - stworzyłem [tag: pure-function], więc jeśli [tag: czysto-funkcjonalny] działa, myślę, że byłoby lepiej użyć istniejącego tagu. –
@RichardJPLeGuen Czysty jak w [funkcjonalna czystość] (http://en.wikipedia.org/wiki/Pure_function), więc czysta funkcja działałaby na to pytanie. czysto funkcjonalny, nie tak bardzo. – Arlen
Dzięki, @Alen! –