【问题标题】:Ruby: Unable to do math operations with two argumentsRuby:无法使用两个参数进行数学运算
【发布时间】:2015-03-21 15:03:28
【问题描述】:

请记住,我对 Ruby 还很陌生。我目前正在关注一个要求我创建一个基本计算器的教程。我需要创建一个具有以下方法的 Calculator 类;描述,加减乘除。

我的初始化方法可以成功获取两个数字,但我似乎无法让其他方法工作。

这是我的代码:

class Calculator
  attr_accessor :x, :y

  def self.description
    "Performs basic mathematical operations"
  end

  def initialize(x, y)
    @x = x
    @y = y
  end

  def add(x, y)
    x += y.to_i
  end

  def subtract(x, y)
    x -= y.to_i
  end
end    

我收到“参数数量错误(0 代表 2)”

【问题讨论】:

  • 遇到异常时调用什么代码?
  • 考虑修复缩进,并显示实际使用此类的代码。当您当前的代码实际上指定它们采用两个参数时,我怀疑您正在调用不带参数的加法和减法。
  • 要完成本教程,我需要通过一系列 Rspec 测试,这里是 initializeadd describe "initialize" do it "takes two numbers" do `expect( @calc.x ) 的 Rspec。 to eq(7)``expect(@calc.y).to eq(2)`endenddescribe "add" doit "adds the two numbers" doexpect( @calc.add ).to eq(9)`end`end

标签: ruby-on-rails ruby methods calculator


【解决方案1】:

代码是正确的,但没有多大意义。您正在将值传递给初始化程序,因此我希望您的代码按照以下方式使用

c = Calculator.new(7, 8)
c.add
# => 15

这可能就是您所说的方式。但是,这是不可能的,因为您将 add() 定义为采用两个参数。因此,您应该使用

c = Calculator.new(7, 8)
c.add(1, 2)
# => 3

但是,将xy 传递给初始化程序有什么意义呢?正确的实现是

class Calculator
  attr_accessor :x, :y

  def self.description
    "Performs basic mathematical operations"
  end

  def initialize(x, y)
    @x = x.to_i
    @y = y.to_i
  end

  def add
    x + y
  end

  def subtract
    x - y
  end
end  

更有可能

class Calculator
  def self.description
    "Performs basic mathematical operations"
  end

  def initialize
  end

  def add(x, y)
    x.to_i + y.to_i
  end

  def subtract(x, y)
    x.to_i - y.to_i
  end
end  

【讨论】:

    【解决方案2】:

    现在您的代码没有多大意义。您的 Calculator 类使用两个值进行初始化,但您从不使用它们。如果你真的想用值进行初始化,你的类应该看起来更像这样:

    class Calculator
      attr_reader :x, :y
    
      def self.description
        "Performs basic mathematical operations"
      end
    
      def initialize(x, y)
        @x = x
        @y = y
      end
    
      def add
        x + y
      end
    
      def subtract
        x - y
      end
    end
    

    然后您将运行如下代码:Calculator.new(3, 5).add,它将返回 8。在这种情况下,您不需要 attr_accessor,只需 attr_reader

    否则,您根本不应该像这样使用值进行初始化:

    class Calculator
    
      def self.description
        "Performs basic mathematical operations"
      end
    
      def add(x, y)
        x + y
      end
    
      def subtract(x, y)
        x - y
      end
    end
    

    你会打电话给Calculator.new.add(3, 5),返回8。这种方法对我来说更有意义,但您使用的教程似乎需要第一种方法。

    您当前的代码也在使用+=-=,但我不确定您要通过此实现什么目标。在您现有的代码中,它们的意义不大,因为您在操作局部变量,而不是实例变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-25
      • 2019-09-23
      • 2021-07-28
      相关资源
      最近更新 更多