我是编程新手,特别是在Ruby中,所以我一直在做一些基本的项目。我有这个代码,据我所知,它应该工作,但它给出了我不希望的结果
程序取a和B并返回^ b。我这样做是为了编程练习,因此为什么我不只是去做一个**。
class Exponate
attr_accessor :args
def initialize args = {}
@args = args
@ans = nil
end
def index
@args[:b].times {
@ans = @args[:a] * @args[:a]
}
puts @ans
end
end
e = Exponate.new(:a => 32, :b => 6)
e.index
e.args[:a] = 5
e.index
返回
1024 # Should be 1_073_741_824
25 # Should be 15_625
但他们肯定不是那个
答案 0 :(得分:1)
您可以这样写:
class Exponate
attr_accessor :args, :ans
def initialize args = {}
@args = args
end
def index
@ans = 1 # multiplication will start from 1
@args[:b].times {
@ans *= @args[:a] #same as @ans = @ans * @args[:a]
}
puts @ans
end
end
答案 1 :(得分:1)
@ans = @args[:a] * @args[:a]
将返回相同的值,无论调用多少次,您都需要以某种方式引用累加器变量以利用循环。
对本地使用实例变量似乎不对 - 它们的生命周期更长,因此在方法退出后,如果仍然在某处引用整个对象,则无法收集它们。此外@
更容易出错 - 如果您输入错字(例如 - @asn
而不是@ans
),您将获得nil
而不是{{} 1}},它可能更难调试,所以最好这样写:
NameError
对于在ruby中使用累加器的循环,最好使用def index
ans = 1
args[:b].times {
ans *= args[:a]
}
puts ans
end
:
Enumerable#inject
这样就不太可能忘记初始化。