質問

が学習したり、新しいプログラミング言語の一つの事業運営が出会いがよいのかどうかの言語は、デフォルトでは、 パスによる価値-パススルーによる参照.

そこでは私からの質問がありますが、お好みの言語 どのよう はい。その き落とし穴?

お好みの言語はもちろん、何か今まで遊: 人気の, , 密教, 新しい, ...

正しい解決策はありません

他のヒント

こちらは自分の貢献を Javaプログラミング言語.

第一部コード:

public void swap(int x, int y)
{
  int tmp = x;
  x = y;
  y = tmp;
}

このメソッドを呼び出します:

int pi = 3;
int everything = 42;

swap(pi, everything);

System.out.println("pi: " + pi);
System.out.println("everything: " + everything);

"Output:
pi: 3
everything: 42"

であっても、"リアル"オブジェクト同様の結果:

public class MyObj {
    private String msg;
    private int number;

    //getters and setters
    public String getMsg() {
        return this.msg;
    }


    public void setMsg(String msg) {
        this.msg = msg;
    }


    public int getNumber() {
        return this.number;
    }


    public void setNumber(int number) {
        this.number = number;
    }

    //constructor
    public MyObj(String msg, int number) {
        setMsg(msg);
        setNumber(number);
    }
}

public static void swap(MyObj x, MyObj y)
{
    MyObj tmp = x;
    x = y;
    y = tmp;
}

public static void main(String args[]) {
    MyObj x = new MyObj("Hello world", 1);
    MyObj y = new MyObj("Goodbye Cruel World", -1); 

    swap(x, y);

    System.out.println(x.getMsg() + " -- "+  x.getNumber());
    System.out.println(y.getMsg() + " -- "+  y.getNumber());
}


"Output:
Hello world -- 1
Goodbye Cruel World -- -1"

このようなJava時のパラメータ による価値, としての価値 piすべMyObj物 な入れ替え.この"価値"は、 唯一の方法 java渡すパラメータをメソッドになっています。(例えば、言語のようにc++での開発者に渡すパラメータ参照を使用'& 後のパラメータ型)

現在の トリッキー部, は、少なくとも部分が混乱させ、新しいjavaベースのシステム開発:(借用 javaworld)
原作:Tony Sintes

public void tricky(Point arg1, Point arg2)
{
    arg1.x = 100;
    arg1.y = 100;
    Point temp = arg1;
    arg1 = arg2;
    arg2 = temp;
}
public static void main(String [] args)
{
    Point pnt1 = new Point(0,0);
    Point pnt2 = new Point(0,0);
    System.out.println("X: " + pnt1.x + " Y: " +pnt1.y); 
    System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);
    System.out.println(" ");
    tricky(pnt1,pnt2);
    System.out.println("X: " + pnt1.x + " Y:" + pnt1.y); 
    System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);  
}


"Output
X: 0 Y: 0
X: 0 Y: 0
X: 100 Y: 100
X: 0 Y: 0"

トリッキー 成功の値を変化させpnt1!このような物を抜いてしまうことが確認された参照の場合はこの限りではありません!正しい計算書連する情報を表示します オブジェクト参照 抜いてしまうことが確認された値です。

以上からTony Sintes:

の方法では変更に 値pnt1でありながらも 渡される値しかし、スワップの pnt1とpnt2に失敗します!この ソースの現場は混乱していた。のmain() 法pnt1とpnt2も 以上のオブジェクト参照です。き pnt1とpnt2のトリッキー()メソッド Javaを通過しによる参照値 というのがそうであるようにパラメータとします。この 意味を参照で渡される 方法は実際のコピー 元の参照です。図1以下 することができます。参照を指 同じオブジェクトのJavaを通るようにする オブジェクトメソッドになっています。

figure 1
(出典: javaworld.com)

結論 や長い話を短:

  • Javaすることでパラメータ による価値
  • による"価値"唯一の方法 javaに渡すパラメータをチューニング方法
  • を使用 方法からオブジェクト として与えられたパラメータ 変化 のオブジェクトの参照点のオブジェクト。(その方法自体の変更一部の値)

有用なリンク:

こちらは別の c#プログラミング言語

c#の時は引数 による価値 (デフォルト)

private void swap(string a, string b) {
  string tmp = a;
  a = b;
  b = tmp;
}

呼び出しこのバージョンのスワップはこのような結果:

string x = "foo";
string y = "bar";
swap(x, y);

"output: 
x: foo
y: bar"

しかし、 とは異なりjava c# の開発の機会を通パラメータ 参照, これはref'キーワードの前の型パラメータ:

private void swap(ref string a, ref string b) {
  string tmp = a;
  a = b;
  b = tmp;
} 

このスワップ 変更の値を参照するパラメータ:

string x = "foo";
string y = "bar";
swap(x, y);

"output: 
x: bar
y: foo"

c#または outキーワード, となり、参考とで微妙なします。らにmsdn:

呼び出し側の方法を outパラメータ 必要がない に割り当ての変数として渡される outパラメータ事前にお電話;しかし、相手先が 必要な に割り当て前のoutパラメータ 満足を追求し続けてまいります。

一方 refパラメータれ、当初の割り当て による 相手先.あなたの相手先であ ない 必要に割り当てるref パラメータを使用してください。Refパラメータ 嫁の両方の出入りの 方法。

小さな落とし穴は、java、 オブジェに渡される値で変更は、内部の方法

結論:

  • c#に渡し、そのパラメータをデフォルトでは、 による価値
  • が必要なときパラメータを渡すことも可能で 参照 のrefキーワード
  • 内のいずれかのパラメータに渡される値 変化 のオブジェクト(その方法自体の変更一部の値)

有用なリンク:

Python 使用パススルーによる価値が、すべての値をオブジェクト参照の効果がうパススルーによる参考値です。しかし、Pythonプログラマの考えをいかどうかのオブジェクトタイプ 変更可能な または 不変なので.可変オブジェクトを変更できる場所(例えば、辞書、リスト、ユーザー定義オブジェクト)では変更不能なオブジェできない(例えば、整数型、文字列、タプル).

次の例は、機能に渡される二つの引数の、変更不能な文字列、および変更可能なリスト。

>>> def do_something(a, b):
...     a = "Red"
...     b.append("Blue")
... 
>>> a = "Yellow"
>>> b = ["Black", "Burgundy"]
>>> do_something(a, b)
>>> print a, b
Yellow ['Black', 'Burgundy', 'Blue']

の線 a = "Red" 単に作らローカル名、 a, の文字列値 "Red" としては効力を持たない渡された引数を隠し、 a として使いこなせなければならな地元の名前からします。課題ではない操作のいずれに帰属するものであるかの引数は変更可能なまたは変更できません。

b パラメータは変更可能なリストオブジェクトの .append() 方法を行う場所のリスト、タックに新しい "Blue" 文字列になる。

(文字列オブジェクトは不変なので、いい方法を支援する場所になります。)

一度の機能を返しますが、再配置 a た効果の拡張 b を明確に示してパススルーによる参考スタイルと呼意味論。

前述のようにある場合でも、引数 a は変更可能なタイプの再配置の機能は操作であろう変化を、渡された引数の値

>>> a = ["Purple", "Violet"]
>>> do_something(a, b)
>>> print a, b
['Purple', 'Violet'] ['Black', 'Burgundy', 'Blue', 'Blue']

思いついたリストによるものであるという機能、利用を不変のタプル型の括弧内のリテラル形式でなく、角括弧)をサポートしていない場所 .append() 方法:

>>> a = "Yellow"
>>> b = ("Black", "Burgundy")
>>> do_something(a, b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in do_something
AttributeError: 'tuple' object has no attribute 'append'

かしたいと思っているPerlの答えしようと思って書きます。

ボンネットの下には、Perlの作品としての効果的なパスによる参考値です。変数として関数呼び出しの引数が渡されreferentially、定数として渡され読み取り値は、結果の表現として渡されtemporaries.通常のイディオムの構築に引数リストの一覧を明らかにし @_, や shift が隠れることから、ユーザーの外観はパススルーにより値:

sub incr {
  my ( $x ) = @_;
  $x++;
}

my $value = 1;
incr($value);
say "Value is now $value";

このまま印刷 Value is now 1 なので $x++ が増加される語彙内で宣言した変数 incr() 機能は、何らかの変数に渡されます。このパススルーによる価値あるスタイルが通常のものとしての機能を改変するその引数が少ないPerlのスタイルすることは避けてください。

しかし、何らかの理由により、あなたはこの行動が特に希望を実現できるよう運営に直接要素を @_ 配列、また別名変数に渡された機能です。

sub incr {
  $_[0]++;
}

my $value = 1;
incr($value);
say "Value is now $value";

この時間で印刷 Value is now 2, ので、 $_[0]++ 発現を増加される実際の $value 可変となります。にこの作品はその下にフード @_ ではないような配列の配列などが得られ my @arrayものではなく、その要素は内蔵の直接の引数に渡される機能。することができますの構築をパススルーによる参照の意味合いが必要となります。関数呼び出しの引数を平変数を挿入して、この配列定数や結果のより複雑な表現を挿入して読み取り専用temporaries.

しかしながら、非常に珍しい現実に、Perl支援の参考値この値を参照するその他の変数.通常の方がはるかに明を構築する機能を明らかな側面の効果を変数による合格への参照を可変となります。これは明示のリーダーのcallsite、パススルーによる参照セマンティクスはこれを切り捨てる。。

sub incr_ref {
  my ( $ref ) = @_;
  $$ref++;
}

my $value = 1;
incr(\$value);
say "Value is now $value";

こちらの \ オペレーター利回りの参考とほとんど同じように、 & アドレスのオペレーター C.

い説明についてはこちら ます。います。

多くの人々が驚きのこの参照オブジェクトを実際に渡される値(C#、Java.このコピーのスタックのアドレスです。これを防ぐ方法を変更する際のオブジェクトを実際にポイントができる方法の変更の価値をオブジェクトです。クライアントまで、フルのC#なのでパスを参照参照により、変更できますが、実際のオブジェクトポイントです。

お忘れなくもあり パス名, は、 パスによる価値の結果.

パスによる価値の結果は、同様の通価値の側面の価値があると設定を変数として渡されたパラメータ.で、ある程度への撹乱を避けなければならなグローバル変数です。あり仕切られたメモリは、パス参照によりこのページ断層参考).

パス名を意味の数値は計算値が実際に使われるものの手続きをすること。アルゴル用のパス名前ですが、面白い副作用がでることがで書くのはたいへん難しいでスワップ手順参考).また、発現した名前再評価の各時間でアクセス可能にしました。

による価値

  • は以下の参照からシステムのパラメータ
  • 使用のみを入力

参照

  • 高速でのみを指すポインタが渡され
  • 使用入力 出力
  • できる非常に危険とともに使用すればグローバル変数

何を言いますとpassによる価値-パススルーにより基準と整合的なものでなければならなています。最も一般的な整合的に定義使用言語であるとのパススルーによる参考とすることができます変数関数に"普通"(ず明示的に取りアドレスまたはこの機能は 割り当て (変更の内容のパラメータ内の関数では同じ効果として割り当て、変数の呼び出します。

このことから、言語グループ化して各グループは、同じ通過意味論。思えば二つの言語にさらすべきではない、同じグループ、チームを例とを区別します。

大多数の言語を含む C, Java, Python, Ruby, JavaScript, スキーム, , Standard ML, , Objective-C, Smalltalk, など。すべて パススルーによる価値のみ.通しのポインタ値(いくつかの言語での参考に"ないものとしてカウントパスを参照;まだ懸念ものを渡され、ポインタのことを指摘。

言語などの C++, C#, PHP デフォルトパススルーによる価値のように言語が機能できる明示的に宣言のパラメータをパススルーによる参照を使用 & または ref.

Perl 常にパススルーによる参照;しかしながら、実際に人がほとんどコピーの値が後できるのではないかと考えて,このように使用でパススルーによる値です。

に関する J, があり、AFAIK、通過による価値があるの通りすがりの参照を可能にする移動の多いデータです。までものとして知られるロケールを動詞(または機能)。できるクラスのインスタンスは汎用の容器です。

spaceused=: [: 7!:5 <
exectime =: 6!:2
big_chunk_of_data =. i. 1000 1000 100
passbyvalue =: 3 : 0
    $ y
    ''
)
locale =. cocreate''
big_chunk_of_data__locale =. big_chunk_of_data
passbyreference =: 3 : 0
    l =. y
    $ big_chunk_of_data__l
    ''
)
exectime 'passbyvalue big_chunk_of_data'
   0.00205586720663967
exectime 'passbyreference locale'
   8.57957102144893e_6

を明らかな不利益であることを知る必要があり名前の変数の一部のものではないでしょうかという機能です。この技術で多くのデータpainlessly.そこで、技術的に行ないよ参考にしながら、"と呼んでいいとのこと。

PHPにも通の値です。

<?php
class Holder {
    private $value;

    public function __construct($value) {
        $this->value = $value;
    }

    public function getValue() {
        return $this->value;
    }
}

function swap($x, $y) {
    $tmp = $x;
    $x = $y;
    $y = $tmp;
}

$a = new Holder('a');
$b = new Holder('b');
swap($a, $b);

echo $a->getValue() . ", " . $b->getValue() . "\n";

出力:

a b

しかしPHP4オブジェてい プリミティブ.る:

<?php
$myData = new Holder('this should be replaced');

function replaceWithGreeting($holder) {
    $myData->setValue('hello');
}

replaceWithGreeting($myData);
echo $myData->getValue(); // Prints out "this should be replaced"

デフォルトでは、ANSI/ISO C用のいずれかでよいを宣言する機能とそのパラメータ。

の場合を宣言する関数パラメータとしてのポインタの機能がパススルーによる照合を宣言する関数パラメータとしてはポインタ変数の機能がパススルーによる値。

void swap(int *x, int *y);   //< Declared as pass-by-reference.
void swap(int x, int y);     //< Declared as pass-by-value (and probably doesn't do anything useful.)

に実行できる問題を設定する場合は、関数ポインタを返し非静的変数で作成された内する機能です。返される値は以下のコードが定義されません--ありがわからない場合、メモリスペースの配分は、一時変数を作成した機能が上書きされます。

float *FtoC(float temp)
{
    float c;
    c = (temp-32)*9/5;
    return &c;
}

だがしかし、への参照を返します静的変数のポインタで渡されたパラメータ一覧です。

float *FtoC(float *temp)
{
    *temp = (*temp-32)*9/5;
    return temp;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top