[#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:44039] Re: スコープについての質問

From: 松房 一郎 <adj41380@...>
Date: 2007-09-17 00:34:46 UTC
List: ruby-list #44039
スコープと、メソッド呼び出しの引数処理、それからメソッドの戻
り値が絡み合っていますね。

まずはなぜそうなるのかの説明

1.メソッド定義内部は独立したスコープになるので外部と同名の
変数があっても無関係
したがって、hidukeメソッドでのtodayへの代入は外部ローカルの
todayには影響しない。
リファレンスマニュアルの 「Rubyの落とし穴、trap::スコープ、
制御構造」に記載があります。

2. メソッド呼び出しの仮引数は、呼び出し時にメソッド定義の
引数に代入されるだけで、メソッド内部での代入は仮引数を変更す
ることはない。
ただし、代入されたオブジェクト自身を変更することは可能でその
効果は仮引数に代入されているオブジェクトにもおよぶ(なぜなら
オブジェクトは同一のものだから)。
なので set メソッドは期待したように働く
 > ary=[];set(ary); p ary  # => ["070901"]


3. hidukeの最後の式がたまたま hiduke内部のtodayへの代入で
あるためにhiddukeメソッドの戻り値が内部のtoday(=入力した文
字)になっている。
> today="0";hiduke(today) → today=hiduke(today)
> とすると "070901" 表示されますが、
today= hiduke(today) で入力文字がhidukeメソッドから戻り、外
部ローカルのtodayへそれが代入されて、入力値がtodayに反映され
ています。

で、メソッドに渡したオブジェクトを変更したいなら次の2つの方
法が定石だと思います。
(外部からデータ入力する部分は本質ではないので省略して、固定
値を戻すサンプルを示します)

1) 渡されたオブジェクトをメソッド内部で変更する

def hiduke(arg); arg.replace("070901"); end
today= "0"; hiduke(today); p today # => "070901"

2) メソッドにブロックを渡す

def hiduke; yield "070901"; end
today= "0";
hiduke { |date| today= date }; p today # => "070901"



142QN4969@plala.or.jp さんは書きました, (2007/09/17 4:23):
> 小原です。御世話になっています。
> 
> わたしの環境は OS=vine linux 3.0
>                ruby 1.8.2 (2004-11-03) [i386-linux] です。
> 
> 次のスクリプトと、その実行結果がなぜそうなるのか、
> 理解できません。
> 
以下省略


In This Thread