Hatena::Groupsubtech

#生存戦略 、それは

-> 08 { 01 / 31 }

参照渡し・値渡し

22:34 | はてなブックマーク - 参照渡し・値渡し - #生存戦略 、それは

AS3は参照渡し(call by reference)ではない。値渡し(call by value)である。

http://d.hatena.ne.jp/flashrod/20080127#1201443331

このエントリーを読んだとき、いやそれ参照渡しでしょ、と思った。という話題を振ったらチョさんがいやその呼び方で良くて、AS/JS には参照渡しは無いよと教えてくれた。

えー ruby のメソッドの引数って全部いわゆる参照渡しだと思ってたんだけど

つまり、参照という言葉使いが2通りあるのが問題で、「参照の参照渡し」と言った場合、前の「参照」は、ポインタ(オブジェクトのアドレス)の事であり、後ろの「参照渡し」はとにかく変数を渡すことです。だから「参照の参照渡し」とは、「ポインタ型変数をそのまま(シンボルとして)渡すこと」となります。

~中略~

で、「Ruby のメソッドの引数の授受は参照の値渡しである」というのが C(++) ユーザへの説明のスタンダードになるわけです。

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/18426

なるほど、参照の値渡しか。というかこの話は higepon と以前した気てきた…。LL しかやってない(自分とか)人は、参照渡しは参照の値渡しという意味の文脈としかとらえられず勘違いしがちかも…。

C/C++ はすらっとコード書けないので PHP の参照渡しを書いてみる。

<?php
function ref($arg) {
  $arg = 'b';
};

$a = 'a';
ref(&$a);

echo $a . "\n"; //=> b
?>

ruby/js/as は参照の値渡し

#!/usr/bin/env ruby

def ref(arg)
  arg = 'b'
end
a = 'a'
ref a
puts a #=> a

perl は参照渡し

#!/usr/bin/env perl
use strict;
use warnings;

sub ref_ {
    $_[0] = 'b';
}

my $a = 'a';
ref_($a);
print $a . "\n"; #=> 'b'

たぶん当たり前のことなんだろうけど間違って覚えていて恥ずかしかったので自警を込めて。

いやでも perl で @_ 参照してるということは配列の中身変更してるから参照の値?なんかよく解らなくなってきた…

トラックバック - http://subtech.g.hatena.ne.jp/secondlife/20080131