计数器内部的功能

时间:2014-12-15 15:37:28

标签: ruby counter

我正在尝试在一个被重复调用的函数中找到一些计数器。

在函数中,gets传递的值介于1和6之间,然后函数内部是一堆if语句。在if语句中我想放一个计数器,所以我知道if语句的每个部分的时间是真的。

我在x = x+1内尝试if,但不喜欢这样:

 def check(number)
    if number == 1
       x = x+1
       if x == 3
         return true
       end
    elsif number == 2
      y = y+1
    elsif number == 3
      z = z + 1
    end
end

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您在这里使用的模式是一种笨重的方式:

def check(number)
  case (number)
  when 1
    @x += 1

    true
  when 2
    @y += 1
  when 3
    @z += 1
  end
 end

请记住,在Ruby中,要评估的最后一个语句是默认返回的语句,因此除非有其他代码,否则无需明确return。在那之后。在这种情况下,没有。

其次,除非你有attr_accessors,否则x = x + 1不会做任何有用的事情。这将声明一个本地的,最初为nil,然后尝试向其添加1,这是一个无效的操作。大概你的意思是让@x在其他地方初始化为0,然后在这里跟踪它。

答案 1 :(得分:0)

局部变量不会在方法的不同调用中保留其值,这将非常奇怪。

如果计数器值在语义上是方法本身的属性,我会使用闭包:

x = y = z = 0
define_method(:check) do |number|
  case number
  when 1 then x += 1; return true if x == 3
  when 2 then y += 1
  when 3 then z += 1
  end
end

或者,如果计数器值在语义上是对象的属性,我会使用私有getter和setter:

def check(number)
  case number
  when 1 then self.x += 1; return true if x == 3
  when 2 then self.y += 1
  when 3 then self.z += 1
  end
end

private

attr_accessor :x, :y, :z

def initialize
  self.x = self.y = self.z = 0
end