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会输出counter,r和的值q。但相反,我得到:

current_trace': undefined local variable or method计数器中为 main:Object (NameError)

  1. 这里有什么问题?
  2. counter我应该如何编写一个方法,在任何给定点输出一些名为、r和的变量的值q(最好不向方法传递参数)?
4

3 回答 3

2

在这种情况下,您的current_trace方法非常简单,不值得将其作为方法。但是查看您的代码,您这样做的原因可能是因为它出现了不止一次。这是代码中应该改进的坏部分。通过重新考虑条件 and 的时间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

(我调整了你的变量名,因为你的代码不起作用,因为你没有显示出哪里ad来自哪里,但这不是重点。)

您可以使用@instance,$global或者CONSTANTs但是那些正在玩具有变量作用域的游戏,当您以某种方法意外更改它们时,这可能会导致问题,通常是因为您输入错误或遗漏了符号 ( @, $) 并无意中创建了一个不改变你想要的。必须使用@var,或者$var在主要级别,只是为了让你的代码工作,这是一个很好的迹象,你实际上做错了什么。

于 2013-09-28T21:29:39.643 回答
-2

我想我想通了。counterr并且q(显然)仅在main's 范围内。我将它们更改为 globals和$counter,现在我可以在我的方法中访问它们。$r$q

(在这里意识到这一点:https ://stackoverflow.com/a/9389532/1468130 )

于 2013-09-28T21:23:19.913 回答