一般的な質問でごめんなさい。私はすべてを検索したところ、非常に多くのスレッドsimilarが見つかりましたが、私の特定の質問に答えるものではありません-私が探している用語が存在しないためかもしれません。
私の友達はプログラミング、特にJavaScriptを学んでいて、なぜこれが機能しないのかと尋ねました。
_var a = "Hello World";
a.replace("Hello", "Goodbye");
console.log(a) // Logs "Hello World"
_
その理由は、JavaSriptでは文字列が不変であるため、replace
はa
を変更しないためです。それをお忘れなくreturns文字列、あなたは次のようなことをする必要があります...
_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
が機能しない理由を尋ねたとき、私は(私の知る限り)知らない単語に手を伸ばしていることに気付きました...
「replace関数は________なので、set文字列を "string dot replace"にする必要があります。」
逆は________なので、set「配列ドットの逆」に等しい配列である必要はありません。」
私はprototype関数に精通していますが、それが私が探しているWordだとは思いません。誰かがこれらの空白を埋めるのを手伝ってくれる?
探している概念のペアは、ミュータブル/イミュータブル parameters とインプレース/結果の返却です。
あなたの例では:
文字列を「string dot replace」に設定する必要があります。replace関数は、Pythonではimmutableという文字列を操作するため、replace関数returns新しい文字列です。 。
C/C++プログラマの場合、これは「参照渡し」ではなく「値渡し」のパラメータとしてよく知られています。不変/になり、結果を返します。
配列を「配列ドット反転」に設定する必要はありません。これは、reverseが配列に作用するためです。つまり、配列はmutableなので、変更を加えることができますin-place =戻る前。
C/C++などの言語では、これは「参照によって渡される」パラメーターとして知られています。つまり、const
、によって変更されていない場合に関数の変更を許可するアドレスを渡します mutate 、返される前に結果を変更するそのアドレスの内容 in-place 。
もちろん、両方のメカニズムによって結果を返す関数を持つことは珍しいことではありません。 int SomeFn(int p1, int p2, int *ErrCode)
can、 potentially は、戻り値とErrCode
の内容を変更することの両方で結果を返します。
完全を期すために、結果を返す3番目のメカニズムは副作用またはglobalによるものです。つまり、ファイルスコープ、プログラム全体、共有、または環境の値を変更します。これは一般にbad newsと見なされます。十分に文書化されていない限り、コードを注意深く読んだ場合にのみ、何が変更されているかを知ることができます。 C/C++などの言語では、特定の名前の外側のスコープ変数を別のモジュールでも使用できるため、これは非常に簡単です。と、同名。 Pythonでは、外側のスコープの値の値を読み取ることができますが、global
キーワードで変更できるように外側のスコープの値が明示的に設定されていない限り、外側のスコープ変数を変更しようとすると、同じ名前のローカルが自動的に作成されます。
それを表現するための私の好ましい方法は:
Array reverse
メソッドはmutatingです。 mutatorです。一般的な特殊なケースはsetterです。
String replace
メソッドはnon-mutatingです。 ミューテーターではないです。 何も変更しない場合、それは副作用なしです。一般的な特殊なケースはgetterです。
JavaScript文字列はimmutableであるため、文字列メソッドは変更できません。
"Hello World" .replace( "Hello"、 "Goodbye");
あなたを不快にさせるはずです。文字列リテラルは変更されません。結果を破棄します。静的コードアナライザーは、このようなバグを検出できる場合があります。
純粋な関数型プログラミングのコンテキストで使用すると、破壊的と呼ばれる、入力値を変更する(したがって、純粋な関数ではない)関数を耳にすることがあります。ただし、これが正しい用語かどうかはわかりません。
あなたの場合、あなたは言うでしょう:
置換関数は破壊的ではないため、文字列を "string dot replace"に設定する必要があります。
逆はdestructiveであるため、配列を「array dot reverse」に設定する必要はありません。
これらは通常、関数とメソッドに分けられます(メソッドは関数のサブセットです)。関数は、独立して呼び出すことができるコードのセクションですが、メソッドには、その関数が動作する現在の「コンテキスト」の概念があります。メソッドのアクションは、そのコンテキストの状態を変更します。
オブジェクト指向プログラミングでは、コンテキストは、関数が動作しているインスタンスです。
おそらく純粋はあなたが探している言葉ですか?
replace()
は、副作用がある(つまり文字列を変更する)ように見えないため純粋(またはそうであるように見える)ですが、reverse()
は状態を変更するため不純です配列の。
正式な回答があるかどうかはわかりませんが、次の2つを参考にしてください。
手順
それは良い answer これに対して question のように見えたからというだけで、それはあなたの質問BTWによく似ています-あなたはそれをチェックする必要があります。
インプレース単項演算
このページを確認してください: Java.util.function 。これは、さまざまなプロトタイプのデリゲート(入力/出力シグネチャ)の一種の構成名を提供します。引数を取り、何も返さないデリゲートはconsumerと呼ばれます。
さて、OOPの賢い生徒として、メソッドは単なる関数であり、非表示のパラメーター(this
)を取ることを認識しておく必要があります。これはリファレンスとして提供されるため、入力パラメーターと出力パラメーターの両方として機能します。
これらのJavaみんな(そして彼らはかなりスマートに見える)によると、単一の入力を受け入れて同じ型の値を返すデリゲートは単項と呼ばれます演算子。
array::Reverse()
の場合、配列は不変ではなく、潜在的に多くのスペースを占有する可能性があるため、適切な操作を実行する方が効率的で便利です。したがって、Reverse()
はインプレース単項演算子です。
しかし、私にとって「演算子」は特別な記号(加算演算子、+
としても知られている)やmod
のような数学キーワードです。したがって、私はそれを演算子イオンと呼び、インプレース単項演算。