一段简单的求斐波拉契数列的 ruby 代码,Fibnacci 类中 attr_accessor 方法定义的属性:memo, :index,代码如下
# 求斐波拉契数列的一个简单方法
class Fibnacci
attr_accessor :memo, :index
def initialize
@memo = {}
@index = 0
end
def fib_pro(n)
return memo[n] if memo.has_key? n
return 1 if n <= 2
memo[n] = fib_pro(n-1) + fib_pro(n-2)
end
def next
# index = @index + 1 # 错误用法1
# index +=1 # 错误用法2
@index += 1 # 正确用法
fib_pro(index)
end
end
obj = Fibnacci.new
puts obj.next
puts obj.next
puts obj.next
puts obj.next
puts obj.next
puts obj.next
期望输出
1
1
2
3
5
8
代码中错误用法 1 得不到正确结果,@index 值没有更新, 错误用法 2 直接报错:undefined method `+' for nil:NilClass (NoMethodError) 问题:为啥同是 attr_accessor 定义的属性 memo[n] = 可以正常使用,index += 报错,index = @index + 1 也不生效 工作中也发现有时候部分 attr_accessor 定义的属性赋值后没被更新,始终没找到根因,求论坛里各路大神指导