0

我试图用 Ruby Shoes 中的 GUI 编写一个简单的计算器。

这个想法是将您按下的按钮上的数字保存在一个数组中,然后从中获取一个整数(添加array[i] * {arraydepth}到数字的循环)。然后我会清除保存我的“结果”显示的堆栈,并将其替换为显示结果的新文本字段(目前它只是说“已更改”,因为我还没有走那么远。)

我的方法不起作用。当我尝试使用此函数将数字添加到我的数组时

def addToVar(number)

  if choosingVar2
    var2Counter += 1
    var2[var2Counter] = number
  else
    var1Counter += 1
    var1[var1Counter] = number
  end

  transToNumber

rescue
  @p.clear { para \"edited\" }

end

它不执行之前的任何代码rescue。我试图在/的东西alert("alert")之前放一个。那行得通,但是第一个之后和之前的所有内容都没有执行。为什么?ifelseifrescue

当我尝试使用以下函数从存储在数组中的值中获取整数时,我遇到了同样的问题

def transToNumber

  mult = 1
  while var1Counter > 0
    var1Num += var1[var1Counter] * mult
    mult *= 10
    var1Counter -= 1
  end

  mult = 1
  while var2Counter > 0
    var2Num += var2[var2Counter] * mult
    mult *= 10
    var2Counter -=1
  end

  @p.clear { para \"edited\" }

end

我怀疑我对数组做错了什么。

完整的代码在这里。

4

1 回答 1

0

您遇到的问题涉及可变范围。在代码顶部定义的所有变量(例如,choosingVar2)都是本地的,对您的方法(如addToVar(number). Ruby 对此抛出了一个错误,但您没有看到任何有用的错误消息,因为通用rescue语句正在捕获但不报告异常。这就是为什么看起来代码没有执行的原因。

我要做的第一件事是注释掉rescue您拥有的语句或让它们显示通用消息,以便您可以更轻松地调试:

rescue Exception => msg
    puts msg

其次,您可以简单地将所有初始变量设置为实例变量,这将使它们可以在您的方法中访问(在我假设是 Shoes 中的类/对象的范围内):

@var2 = []
@var2[0] = 0
@var2Counter = 0
@var2Num = 0

@choosingVar2 = false

def addToVar(number)
  if @choosingVar2 
        @var2Counter += 1
        @var2[@var2Counter] = number
...

有关变量范围的更多信息,您可以在线找到大量教程和优秀的文章(或在 ruby​​ 文档本身中)。这是一个例子:http: //zetcode.com/lang/rubytutorial/variables/

于 2013-09-07T09:47:04.453 回答