[#43996] ある日付の最終時刻の求め方 (秒単位) — SATOH Fumiyasu <fumiyas@...>

さとうふみやす @ OSS テクノロジです。

14 messages 2007/09/05
[#43998] Re: ある日付の最終時刻の求め方 (秒単位) — "GOTO Kentaro" <gotoken@...> 2007/09/05

07/09/05 に SATOH Fumiyasu<fumiyas@osstech.jp> さんは書きました:

[ruby-list:44043] Re: スコープについての質問

From: "Dan Yamamoto" <dan@...>
Date: 2007-09-20 05:58:38 UTC
List: ruby-list #44043
だんです。

私もかつて同じところで悩んだ覚えがあります。
自分がなかなか理解できなかったところを思い出して説明を書いてみました。


> today=gets.chomp

自分の経験だと、いちばん理解しがたかったのが hiduke メソッドの中にあるこ
の代入です。 gets 等の処理は今回の問題と関係ないと思うので、もとソースを
次のように書き換えます。

def foo(a)
  a = "bye"
end

def bar(a)
  a[0] = "bye"
end

a = "hello"
foo(a)
p a    #=> "hello"

a = ["hello"]
bar(a)
p a    #=> ["bye"]


で、問題はこのソースの先頭から2行目の部分です。

  a = "bye"

この代入が実行される直前までは、 a には "hello" という文字列が代入されて
います。つまり、 a はトップレベル(メソッドの外)で生成された "hello" と
いう文字列オブジェクトを差しているわけです。

しかし、ここで a = "bye" という代入を実行すると、 a はここで新しく生成さ
れた "bye" という文字列オブジェクトを指し示すことになり、もとの "hello"
とは一切関係がなくなります。この時点でもうメソッドの中からトップレベルの
"hello" を操作することはでません。トップレベルの a と foo の引数の a は
たまたま同じ名前の別の変数が、同じオブジェクトを指していただけで、それ以
上の関連はありません。

それに対し bar メソッドの a は常にトップレベルの配列オブジェクトを指し
続けています。次のようなインデックスを用いた代入は、あくまで配列オブジェ
クトに対する操作です。

  a[0] = オブジェクト

このような代入を行っても a の指している配列オブジェクトの中身が変わるだ
けで、 a がもとの配列オブジェクトを指し示しているという関係は何ら変わり
ません。

ここでもし、次のように a に対して別の新しい配列を関連付けてしまえば、トッ
プレベルのオブジェクトに対して影響を与えることができなくなります。

  a = []
  a[0] = "bye"

In This Thread