我正在尝试在一个被重复调用的函数中找到一些计数器。
在函数中,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
有什么建议吗?
答案 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