[#43191] ActiveTclのインストール — HIiroshi Kasamatsu <qqmn89yb9@...>

こんにちは、笠松と申します。

13 messages 2007/02/17
[#43193] Re: ActiveTclのインストール — Hidetoshi NAGAI <nagai@...> 2007/02/18

永井@知能.九工大です.

[#43198] Re: ActiveTclのインストール — HIiroshi Kasamatsu <qqmn89yb9@...> 2007/02/18

永井さん、アドバイスありがとうございます。

[#43217] Ruby 1.8.6 preview2 has been released — "Akinori MUSHA" <knu@...>

 Ruby 1.8.6 preview2 をリリースしました。

13 messages 2007/02/24

[ruby-list:43154] Re: 配列は、メソッド呼出における引数初期化の例外なんでしょうか

From: <s-matsu@...>
Date: 2007-02-02 01:24:19 UTC
List: ruby-list #43154
松谷と申します。

変数が参照している「オブジェクトそのもの」を書き換えるかどうか、
(破壊的かどうか)がポイントのようですね。

便宜上、henkanの引数を

h_ary,h_str
とします。

def henkan(h_ary, h_str)
  p [21, h_str, h_ary]
  h_ary.shift
  h_str = "new"
  p [22, h_str, h_ary]
end

関数呼び出し直後には

ary → ["(", "{"] ← h_ary
str  →    "old"    ← h_str

のように関数の外の変数と関数内の変数は同じオブジェクト
を参照した状態になります。
ここで、

h_ary.shift

の操作を行うと、h_aryが参照する「オブジェクトそのもの」が変化します。

ary → ["{"] ← h_ary

それに対し、

h_str = "new"

の操作では、「オブジェクトそのもの」は変化せず、h_strの参照先が変わります。

str  → "old"       h_str  → "new"

このような動作の違いは、対象がArrayか文字列かによるわけでは
なく、対象に対する操作が破壊的かどうかによります。
ary.shiftは破壊的ですが、代入(str=)は破壊的でないのです。

ここで、文字列を破壊的に書き換えることもできます。
ruby自体は初心者なのでちょっと自信は無いですが、
以下のような方法で実現できます。

def henkan(h_ary, h_str)
  p [21, h_str, h_ary]
  h_ary.shift
  h_str[h_str] = "new" 
  p [22, h_str, h_ary]
end
str = "old"; ary = ["(", "{"]
p [11, str, ary]
henkan(ary, str)
p [19, str, ary]
--------------------------------
[11, "old", ["(", "{"]]
[21, "old", ["(", "{"]]
[22, "new", ["{"]]
[19, "new", ["{"]]



>Masouです。
>2度目です。すみません。
>
>> 再帰でメソッドを呼び出して、そのメソッドがローカル変数(や引
>> 数)を書き換えても、その変更は呼び出し元には影響を与えません。
>> ローカル変数や引数はメソッド呼び出しごとに初期化される独立し
>> た存在です。ですから、これは「正しい」動作ですね。
>
>文字列は初期化されますが、Arrayは初期化されず、
>書換えた結果が呼び出し元に返されてます。
>
>[テストプログラムです。] -------
>def henkan(ary, str)
>  p [21, str, ary]
>  ary.shift
>  str = "new"
>  p [22, str, ary]
>end
>
>str = "old"; ary = ["(", "{"]
>p [11, str, ary]
>henkan(ary, str)
>p [19, str, ary]
>
>[結果です] ------------
>[11, "old", ["(", "{"]]
>  [21, "old", ["(", "{"]]
>  [22, "new", ["{"]]
>[19, "old", ["{"]]
>
>配列の場合には、初期化されてないようにみえます。
>レファレンスも読んだんですがよく解からなくて
>質問させていただきました。
>よろしくお願いします。
>
>ttp://masou.blogspot.com/
>
>
>
>
>

In This Thread