プロが教える店舗&オフィスのセキュリティ対策術

ltotal = 0 #行数の合計
wtotal = 0 #単語数の合計
ctotal = 0 #文字数の合計
ARGV.each do |file|
begin
input = open(file) #ファイルを開く(A)
l = 0 #file内の行数
w = 0 #file内の単語数
c = 0 #file内の文字数
while line = input.gets
l += 1
c += line.size
line.sub!(/^\s+/) #行頭の空白を削除
ary = line.split(/\s+/) #空白文字で分解
w += ary.size
end
input.close #ファイルを閉じる
printf("%8d %8d %8d %s\n", l, w, c, file) #出力を整形する
ltotal += l
wtotal += w
ctotal += c
rescue => ex
print ex.message, "\n" #例外メッセージを出力(B)
end
end
printf("%8d %8d %8d %s\n", ltotal, wtotal, ctotal, "total")


ローカル変数はメソッドを抜けると値を忘れてしまうのでは
なかったでしょうか・・・
ここでltotalやwtotal等を呼び出しているのは明らかに
メソッドの外部からだと思うのですが、変数に入れられた
値は保持されたまま表示されるのでしょうか

A 回答 (2件)

http://doc.okkez.net/static/191/doc/spec=2fvaria …

> 最初の代入はそのスコープに属するローカル変数の宣言になります。

> ローカル変数のスコープは、((*宣言した位置から*))その変数が宣言されたブロック、メソッド定義、またはクラス/モジュール定義の終りまでです

とあります。

「最初の代入」は
> total = 0 #行数の合計
> wtotal = 0 #単語数の合計
> ctotal = 0 #文字数の合計

です。例の場合、この外側にブロック等が無いので、ファイルの終わりがブロックの終わり=スコープの終わりです。

> l = 0 #file内の行数
> w = 0 #file内の単語数
> c = 0 #file内の文字数
これらは、eachのブロックの中で最初に代入されたので、ブロックにローカルな変数になり、ブロックの終わりのendまでがスコープで、その外では使えません。
# こういうのは「メソッドの中」とは言いません。
# メソッドの中、というの、普通は「メソッド定義の中」「メソッドの実装」を指します。

> ltotal += l
> wtotal += w
> ctotal += c

ここのltotal,wtotak,ctotalは、ブロックの外で宣言されたltotal,wtotak,ctotalそのものです。
eachのブロックローカルなものではありません。
    • good
    • 0
この回答へのお礼

ありがとうございました。
とっても参考になりました。
メソッドの中とはメソッド定義に中のこと
だったんですね・・・未熟な質問に答えて
いただき本当に有難うございます。

お礼日時:2012/04/13 06:17

すみません。


どこが「メソッド」なのでしょう?
どこが「メソッドの外部」で、どこで「メソッドから抜け」てますか?

ltotalやwtotalはずっと有効なスコープのままですけど。

この回答への補足

ここでいうメソッドはeachメソッドから抜けても・・・って意味でした。

補足日時:2012/04/11 09:36
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!