Przepraszam za ogólne pytanie. Przeszukałem wszystkie i znalazłem tak wiele wątków podobnych do tego, jednak żaden nie odpowiada na moje konkretne pytanie - być może dlatego, że szukany termin nawet nie istnieje.
Mój przyjaciel uczy się programowania, w szczególności JavaScript, i zapytał mnie, dlaczego to nie działa:
var a = "Hello World";
a.replace("Hello", "Goodbye");
console.log(a) // Logs "Hello World"
Powodem jest to, że replace
się nie modyfikuje a
, ponieważ ciągi są niezmienne w JavaSript. Ponieważ zwraca ciąg, musisz zrobić coś takiego jak ...
var a = "Hello World";
a = a.replace("Hello", "Goodbye");
console.log(a); // Logs "Goodbye World"
Jednak alternatywą jest funkcja taka jak JavaScript reverse()
, ponieważ modyfikuje to, co ją wywołuje. Na przykład:
var fruits = ["Apples", "Oranges", "Bananas"];
fruits.reverse();
console.log(fruits) // ["Bananas", "Oranges", "Apples"]
Kiedy mój przyjaciel zapytał mnie, dlaczego jego replace
nie działa, zdałem sobie sprawę, że sięgam po słowo, którego nie znam (o ile mi wiadomo) ...
„Musisz ustawić ciąg na„ ciąg kropki zamień ”, ponieważ funkcja zamiany to ________.”
Nie musisz ustawiać tablicy równej „odwrotnej macierzy”, ponieważ odwrotność to ________. ”
Znam prototypowe funkcje, choć nie sądzę, że tego słowa szukam. Czy ktoś może mi pomóc wypełnić te pola?
źródło
You don't need to set an array equal to "array dot reverse", because reverse is a mutator function
. I pomyśleć Słyszałem, że terminologia odnosi się do funkcji, które „mutate” instancję, która je wywołuje. Ale prawdopodobnie powinieneś sprawdzić to jeszcze gdzieś indziej.Odpowiedzi:
Para pojęć, których szukasz, to zmienne / niezmienne parametry oraz miejsce / zwracanie wyników.
W twoich przykładach:
Musisz ustawić ciąg na „ciąg kropki zamień”, ponieważ funkcja zamiany działa na ciąg znaków, który w Pythonie jest niezmienny, więc funkcja zamiany zwraca nowy ciąg.
Dla programisty C / C ++ jest to bardziej znane jako parametry „przekazywane przez wartość”, a nie „przekazywane przez referencję”, co czyni je niezmiennymi i zwraca wynik.
Nie musisz ustawiać tablicy równej „odwróceniu kropki macierzy”, ponieważ odwrotność działa na tablicy, która jest zmienna , więc jest w stanie wprowadzić zmiany w miejscu przed powrotem.
W językach takich jak C / C ++ jest to znane jako parametry „przekazywane przez referencję”, tj. Przekazywanie adresu, który, jeśli nie zostanie zmodyfikowany przez
const
, umożliwia funkcji zmianę, mutację , zawartość tego adresu zmieniającą wyniki w miejscu przed zwróceniem.Oczywiście nie jest niczym niezwykłym posiadanie funkcji, która zwraca wyniki przez oba mechanizmy, np.
int SomeFn(int p1, int p2, int *ErrCode)
Może potencjalnie zwracać wyniki zarówno w wartości zwracanej, jak i przez modyfikowanie zawartościErrCode
.Trzecia metoda
Dla kompletności trzecim mechanizmem zwracania wyników jest efekt uboczny lub globalny , tj. Modyfikacja zakresu pliku, całego programu, wartości wspólnych lub środowiskowych. Jest to ogólnie uważane za złe wieści, ponieważ o ile nie są dobrze udokumentowane, można dowiedzieć się, co się zmienia, uważnie czytając kod. W językach takich jak C / C ++ jest to zbyt łatwe, ponieważ ma zmienną zakresu zewnętrznego o podanej nazwie, być może nawet w innym module, i nie ma maskującej zmiennej zakresu lokalnego o tej samej nazwie. W Pythonie można odczytywać wartości wartości w zewnętrznych zakresach, chyba że wartości zakresu zewnętrznego są jawnie ustawione jako dostępne do modyfikacji za pomocą
global
słowo kluczowe, próba modyfikacji zmiennej zasięgu zewnętrznego automatycznie tworzy lokal o tej samej nazwie.źródło
(The reverse function is a _______ function.
) Biorąc to pod uwagę, jest to prawie identyczna odpowiedź na tę, którą ostatecznie dałem przyjacielowi, więc doceniam twoje potwierdzenie - choć wciąż zastanawiam się, czy są jakieś konkretne warunki. Pozwolę, aby pytanie pozostało otwarte, ale z pewnością zaakceptuję to jako odpowiedź, w przypadku gdy te słowa po prostu nie istnieją.Mój preferowany sposób wyrażenia tego to:
Macierz
reverse
metoda mutacji . To mutator . Częstym przypadkiem specjalnym jest seter .Metoda String nie
replace
powoduje mutacji . To nie jest mutator . Jeśli niczego nie modyfikuje , jest wolny od skutków ubocznych . Częstym przypadkiem specjalnym jest getter .Ponieważ ciągi JavaScript są niezmienne , metody ciągów nie mogą mutować.
powinno sprawić, że poczujesz się niekomfortowo. Nie modyfikuje literału łańcucha. Odrzuca wynik. Analizatory kodów statycznych mogą czasem wykryć takie błędy.
źródło
Czasami w kontekście czystego programowania funkcjonalnego słyszałem funkcje, które modyfikują wartość wejściową (a zatem nie są czystymi funkcjami), zwane destrukcyjnymi . Nie jestem jednak pewien, czy jest to właściwy termin.
W twoim przypadku powiedziałbyś:
źródło
Być może słowo jest czyste , którego szukasz?
replace()
jest (lub wydaje się być) czysty, ponieważ nie wygląda na to, aby miał jakieś skutki uboczne (tj. modyfikowanie łańcucha), podczas gdyreverse()
jest nieczysty, ponieważ zmienia stan tablicy.źródło
Zazwyczaj byłyby one podzielone na funkcje i metody (gdzie metody są podzbiorem funkcji). Funkcja jest sekcją kodu, którą można wywołać w oderwaniu, podczas gdy metoda ma pojęcie bieżącego „kontekstu”, w którym działa. Działanie metody zmienia stan jej kontekstu.
W programowaniu obiektowym kontekstem jest instancja, na której działa funkcja.
źródło
Nie wiem, czy istnieje oficjalna odpowiedź, ale oto dwie, które mogą ci się spodobać.
Procedura
Tylko dlatego, że wydawało się to dobrą odpowiedzią na to pytanie , które bardzo przypomina twoje pytanie BTW - powinieneś to sprawdzić.
Jednorazowa operacja w miejscu
Przejrzyj tę stronę: java.util.function . Zapewnia rodzaj wymyślonej nazwy dla delegatów (podpisy wejściowe / wyjściowe) różnych prototypów, np. Delegat, który przyjmuje argument i nic nie zwraca, nazywany jest konsumentem .
Teraz, jako bystry uczeń OOP, powinieneś zdawać sobie sprawę, że metoda jest tylko funkcją, która przyjmuje ukryty parametr (
this
). Ponieważ jest dostarczany jako odniesienie, służy zarówno jako parametr wejściowy, jak i wyjściowy.Według tych facetów Java (i wydają się całkiem sprytni), delegat, który akceptuje pojedyncze dane wejściowe i zwraca wartość tego samego typu, nazywany jest operatorem jednoargumentowym .
Teraz, w przypadku
array::Reverse()
, tablica nie jest niezmienna i może potencjalnie zajmować dużo miejsca, więc jest bardziej wydajna i wygodniejsza do wykonania operacji w miejscu. DlategoReverse()
jest jednostronnym operatorem na miejscu .Ale dla mnie „operator” jest specjalnym symbolem (jak operator dodawania, znany również jako
+
) lub matematycznym słowem kluczowym, takim jakmod
. Dlatego wolę nazywać to jonem operacyjnym , dającym jednostronną operację w miejscu .źródło
Reverse()
Nie jest to operator jednoargumentowy operator nie musi powrócić do wartości tego samego typu (na przykład!
,delete
,typeof
), oraz operatorzy nie osób. Ale „w miejscu” to dobry termin na metodę modyfikującą jej instancję. [Nie głosowałem za odrzuceniem, ale wygląda na to, że ktoś głosował za odrzuceniem wszystkich odpowiedzi, mimo że wszystkie były przydatne.]Reverse()
jest operacją jednoargumentową. Ale ogólnie zgadzam się, że to wszystko jest trochę dziwne, ale używam dosłownie terminologii z powiązanego dokumentu , który wydaje się być autorstwa autorów całkiem sprytnych. Przynajmniej jest to lepsze niż nic.