0

「プログラミング ruby​​ 1.9」から ruby​​ を学んでいます。ruby-debug の使い方を学んでいるので、下で何が起こっているのか理解できます。ruby-debug19 などを統合しているため、私は ruby​​mine を使用しています (gem がないと表示され、インストールされます)。これが質問です。コードをステップ実行して、変数とスタックを調べることができました。ただし、に達するとfor i in 0...5、デバッガーは次のように言います

スタック フレームは利用できません

ruby が for ループをあまり使用しないことは知っていますが、for ループを介したデバッグがあるかどうかを知りたいです。

コード:

    raw_text  = %{
The problem breaks down into two parts. First, given some text as a
string, return a list of words. That sounds like an array. Then, build a 
count for each distinct word. That sounds like a use for a hash---we can 
index it with the word and use the corresponding entry to keep a count.}

word_list = words_from_string(raw_text)
counts    = count_frequency(word_list)
sorted    = counts.sort_by {|word, count| count}
top_five  = sorted.last(5)

for i in 0...5            # (this is ugly code--read on
  word = top_five[i][0]   #  for a better version)
  count = top_five[i][1]
  puts "#{word}:  #{count}"
end
4

1 に答える 1

2

Ruby言語仕様(91ページの11.5.2.3.4節)を見ると、次のことがわかります。

for i in 0...5
  word = top_five[i][0]
  count = top_five[i][1]
  puts "#{word}:  #{count}"
end

のシンタックスシュガーです

(0...5).each do |i|
  word = top_five[i][0]
  count = top_five[i][1]
  puts "#{word}:  #{count}"
end

ただし、ブロックに対して新しい変数スコープは作成されません。したがって、withのコードは、のコードforに変換され、eachそのように記述されているかのように実行されます。ただし、ループで使用される変数forが周囲のスコープにリークする点が異なります。

別の言い方をすれば、for実際に実行されますeach、ブロックに新しいスタックフレームを割り当てません。したがって、エラーメッセージは正確に正しいです。ブロックへの呼び出しがありますが、どういうわけか、そのブロック呼び出しに割り当てられたスタックフレームがありません。それは明らかにデバッガーを混乱させます。

forこれはバグであり、ループはデバッガー内で特別な処理を受ける必要があると主張する人もいるかもしれません。ループを使用する人は誰もいないので、これまで誰もそのバグを修正する必要はなかったと思いforます。ループが周囲のスコープに変数をリークし、そうでない慣用句とまったく同じだからです。each

「変数のリーク」とはどういう意味ですか?ここを参照してください:

(1..2).each do |i|
  t = true
end

i
# NameError: undefined local variable or method `i' for main:Object

t
# NameError: undefined local variable or method `t' for main:Object

for i in 1..2
  t = true
end

i
# => 2

t
# => true
于 2012-09-19T13:43:59.393 に答える