求幂不起作用
Exponentiation not working
我是编程新手,尤其是 Ruby,所以我一直在做一些基础项目。我有这段代码,据我所知,它应该可以工作,但它给出了我不期望的结果
程序取 a 和 B 和 returns a^b。我这样做是作为一个编程练习,因此我为什么不直接去 a**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
Returns
1024 # Should be 1_073_741_824
25 # Should be 15_625
但他们绝对不是那样
你可以这样写:
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
@ans = @args[:a] * @args[:a]
会return相同的值,无论调用多少次,都需要通过某种方式引用累加器变量,才能利用循环。
对局部变量使用实例变量似乎不对 - 它们的生命周期更长,因此在方法退出后,如果整个对象仍在某处引用,则无法收集它们。此外,@
更容易出错 - 如果您输入错误(例如 - @asn
而不是 @ans
),您将得到 nil
而不是 NameError
,调试起来可能比较麻烦,这样写比较好:
def index
ans = 1
args[:b].times {
ans *= args[:a]
}
puts ans
end
对于在 ruby 中带有累加器的循环,最好使用 Enumerable#inject
:
@ans = @args[:b].times.inject(1){|acc,v| acc * @args[:a]}
这样就不太可能忘记初始化。
我是编程新手,尤其是 Ruby,所以我一直在做一些基础项目。我有这段代码,据我所知,它应该可以工作,但它给出了我不期望的结果
程序取 a 和 B 和 returns a^b。我这样做是作为一个编程练习,因此我为什么不直接去 a**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
Returns
1024 # Should be 1_073_741_824
25 # Should be 15_625
但他们绝对不是那样
你可以这样写:
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
@ans = @args[:a] * @args[:a]
会return相同的值,无论调用多少次,都需要通过某种方式引用累加器变量,才能利用循环。
对局部变量使用实例变量似乎不对 - 它们的生命周期更长,因此在方法退出后,如果整个对象仍在某处引用,则无法收集它们。此外,@
更容易出错 - 如果您输入错误(例如 - @asn
而不是 @ans
),您将得到 nil
而不是 NameError
,调试起来可能比较麻烦,这样写比较好:
def index
ans = 1
args[:b].times {
ans *= args[:a]
}
puts ans
end
对于在 ruby 中带有累加器的循环,最好使用 Enumerable#inject
:
@ans = @args[:b].times.inject(1){|acc,v| acc * @args[:a]}
这样就不太可能忘记初始化。