求幂不起作用

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]}

这样就不太可能忘记初始化。