Извините за общий вопрос. Я искал повсюду и нашел так много тем, похожих на эту, но не ту, которая отвечает на мой конкретный вопрос - возможно, потому что искомый термин даже не существует.
Мой друг изучает программирование, особенно JavaScript, и спросил меня, почему это не работает:
var a = "Hello World";
a.replace("Hello", "Goodbye");
console.log(a) // Logs "Hello World"
Причина в том, что replace
не изменяется a
, поскольку строки являются неизменяемыми в JavaSript. Поскольку он возвращает строку, вам нужно сделать что-то вроде ...
var a = "Hello World";
a = a.replace("Hello", "Goodbye");
console.log(a); // Logs "Goodbye World"
Однако альтернативой является функция, подобная JavaScript reverse()
, так как она изменяет все, что ее вызывает. Например:
var fruits = ["Apples", "Oranges", "Bananas"];
fruits.reverse();
console.log(fruits) // ["Bananas", "Oranges", "Apples"]
Когда мой друг спросил меня, почему он replace
не работает, я понял, что искал слово, которое я не знаю (насколько я знаю) ...
Msgstr "Вы должны установить строку как" замена точки строки ", потому что функция замены - ________."
Вам не нужно устанавливать массив равным «обратная точка массива», потому что обратный - ________. »
Я знаком с функциями- прототипами, хотя не верю, что это слово, которое я ищу. Может ли кто-нибудь помочь мне заполнить эти пробелы?
You don't need to set an array equal to "array dot reverse", because reverse is a mutator function
. Я думаю, что я слышал эту терминологию для обозначения функций, которые "видоизменяют" экземпляр, который их вызывает. Но вам, вероятно, стоит проверить это еще где-нибудь.Ответы:
Пара понятий, которые вы ищете, это изменчивые / неизменные параметры и на месте / возвращение результатов.
В ваших примерах:
Вы должны установить строку «string dot replace», потому что функция replace работает со строкой, которая в python неизменна, поэтому функция replace возвращает новую строку.
Для программиста C / C ++ это более привычно, поскольку параметры «передаются по значению», а не «передаются по ссылке», что делает их неизменяемыми и возвращает результат.
Вам не нужно устанавливать массив равным «обратному массиву точек», потому что обратный метод работает с массивом, который является изменяемым , поэтому может вносить изменения на месте перед возвратом.
В таких языках, как C / C ++, это называется параметрами, «передаваемыми по ссылке», то есть передачей адреса, который, если он не изменен
const
, позволяет функции изменять, мутировать содержимое этого адреса, изменяя результаты на месте перед возвратом.Конечно, нет ничего необычного в том, чтобы иметь функцию, которая возвращает результаты обоими механизмами, например,
int SomeFn(int p1, int p2, int *ErrCode)
может, потенциально возвращать результаты как в возвращаемом значении, так и путем изменения содержимогоErrCode
.3-й метод
Для полноты 3-й механизм возврата результатов является побочным эффектом или глобальным , то есть изменяя область файла, обще программные, общие или окружающие значения. Обычно это считается плохой новостью, поскольку, если не очень хорошо задокументировано, вы можете узнать только то, что изменяется, внимательно прочитав код. В таких языках, как C / C ++, это слишком легко сделать, имея внешнюю переменную области с заданным именем, возможно, даже в другом модуле, и не маскируя локальную переменную области с тем же именем. В Python вы можете читать значения значений во внешних областях, если только внешние значения области явно не установлены как доступные для изменения с помощью
global
Ключевое слово, при попытке изменить внешнюю переменную области автоматически создает локальный файл с тем же именем.источник
(The reverse function is a _______ function.
) Это, как говорится, это почти идентичный ответ на тот, который я в конечном итоге дал мой друг, поэтому я ценю ваше подтверждение - хотя я все еще задаюсь вопросом, есть ли конкретные условия. Я позволю этому вопросу остаться открытым некоторое время, но, безусловно, приму это как ответ в случае, если этих слов просто не существует.Мой предпочтительный способ выразить это:
Массив
reverse
метод мутирует . Это мутатор . Распространенным частным случаем является сеттер .Метод String не
replace
является мутирующим . Это не мутатор . Если это не меняет ничего , это побочный эффект бесплатно . Распространенным частным случаем является добытчик .Поскольку строки JavaScript являются неизменяемыми , методы String не могут быть мутированными.
должно сделать вас неудобным. Он не изменяет строковый литерал. Это отбрасывает результат. Статические анализаторы кода иногда могут обнаруживать такие ошибки.
источник
Иногда при использовании в контексте чисто функционального программирования я слышал функции, которые изменяют входное значение (и, следовательно, не являются чисто функциями), называемые деструктивными . Я не уверен, что это правильный термин, хотя.
В вашем случае вы бы сказали:
источник
Возможно, чистое слово, которое вы ищете?
replace()
является (или кажется) чистым, потому что не имеет побочных эффектов (т. е.reverse()
изменяет строку), тогда как является нечистым, потому что изменяет состояние массива.источник
Они обычно разделяются на функции и методы (где методы являются подмножеством функций). Функция - это фрагмент кода, который можно вызывать изолированно, в то время как у метода есть понятие текущего «контекста», над которым он работает. Действие метода изменяет состояние его контекста.
В объектно-ориентированном программировании контекст является экземпляром, над которым работает функция.
источник
Я не знаю, есть ли официальный ответ, но вот два, которые вам могут понравиться.
Процедура
Только потому, что это казалось хорошим ответом на этот вопрос , который очень похож на ваш вопрос, кстати, вы должны это проверить.
На месте одинарная операция
Просмотрите эту страницу: java.util.function . Он предоставляет своего рода выдуманное имя для делегатов (входные / выходные сигнатуры) различных прототипов, например, делегат, который принимает аргумент и ничего не возвращает, называется потребителем .
Теперь, будучи проницательным учеником ООП, вы должны знать, что метод - это просто функция, которая принимает скрытый параметр (
this
). Поскольку он предоставляется в качестве ссылки, он служит как входным, так и выходным параметром.Согласно этим Java-парням (и они кажутся довольно умными), делегат, который принимает один вход и возвращает значение того же типа, называется унарным оператором .
Теперь, в случае
array::Reverse()
, массив не является неизменным и потенциально может занимать много места, поэтому более эффективно и удобно выполнять операцию на месте. ПоэтомуReverse()
это унарный оператор на месте .Но для меня «оператор» - это специальный символ (например, оператор сложения, также известный как
+
) или математическое ключевое слово, подобноеmod
. Поэтому я предпочитаю называть это Operat ионом , получая в месте унарных операций .источник
Reverse()
не является оператором, унарный оператор не должен возвращать значение одного и того же типа (например!
,delete
,typeof
), а операторы не являются делегатами. Но «на месте» - это хороший термин для метода, который модифицирует его экземпляр. [Я не голосовал против, но похоже, что кто-то проголосовал против всех ответов, хотя все они полезны.]Reverse()
, это унарная операция. Но в целом я согласен, что все это немного странно, но я дословно использую терминологию из связанного документа , который, кажется, был создан некоторыми довольно умными людьми. По крайней мере, это лучше, чем ничего.