0

除算アルゴリズムのスクリプトを書いているとします。

def current_trace
  puts "Counter: #{counter}; r: #{r}; q: #{q}"
end

r = a
q = 0
counter = 0

while r >= d
  current_trace
  r = r - d
  q = q + 1
  counter += 1
end
current_trace

を呼び出すと、およびcurrent_traceの値が出力されると予想していました。しかし、代わりに私は得る:counterrq

in current_trace': undefined local variable or methodcounter' for main:Object (NameError)

  1. ここで何が問題なのですか?
  2. counterr、およびという名前の変数の値をq任意の時点で (できればメソッドに引数を渡さずに)出力するメソッドを作成するにはどうすればよいですか?
4

3 に答える 3

2

この場合、current_traceメソッドは非常に単純であるため、メソッドにする価値はありません。しかし、あなたのコードを見ると、その理由はおそらく複数回出現するためです。これは、改善する必要があるコードの悪い部分です。条件と のタイミングを再検討することで、2 つの異なる場所でのputs呼び出しを回避できます。puts

counter, q, r = 0, 0, a
loop do
  puts "Counter: #{counter}; q: #{q}; r: #{r}"
  break if r < d
  counter += 1
  q += 1
  r -= d
end
于 2013-09-28T21:51:40.107 に答える
1

正しいことは、パラメーターを受け入れるようにメソッドを作成することです。

def current_trace(c, r, q)
  puts "Counter: #{ c }; r: #{ r }; q: #{ q }"
end

次に、次のように呼び出します。

d = 1          
r = 5          
q = 0          
counter = 0    

while r >= d                      
  current_trace(counter, r, q)    
  r = r - d                       
  q = q + 1                       
  counter += 1                    
end                               

current_trace(counter, r, q) 

結果は次のとおりです。

Counter: 0; r: 5; q: 0
Counter: 1; r: 4; q: 1
Counter: 2; r: 3; q: 2
Counter: 3; r: 2; q: 3
Counter: 4; r: 1; q: 4
Counter: 5; r: 0; q: 5

a(変数名を微調整したのは、どこからd来たのかを示していないためにコードが機能しないためですが、それは重要ではありません。)

@instance$globalまたはを使用できますCONSTANTsが、それらは変数スコープでゲームをプレイしているため、何らかのメソッドで誤ってそれらを変更すると問題が発生する可能性があり@ます$。必要なものを変更します。@varコードを機能させるためだけに、またはメイン レベルで使用$varしなければならないことは、実際に何か間違ったことをしているというかなり良い兆候です。

于 2013-09-28T21:29:39.643 に答える