ruby - 如何将数学运算(例如 +、-、*、/)作为参数传递给方法

标签 ruby

我正在编写逆波兰表示法 (RPN) 计算器,到目前为止,它看起来像这样:

class RPNCalculator
  attr_accessor :numbers, :value
  def initialize
    @numbers = []
    @value = nil
  end

  def push(number)
    @numbers.push(number)
  end

  def plus
    if value.nil?
      number1=@numbers.pop
      number2=@numbers.pop
      @value = number1 + number2
    else
      @value += @numbers.pop
    end
  end

  # minus_proc = Proc.new {|a,b| a - b}

  def minus
    number1=@numbers.pop
    number2=@numbers.pop
    @value = number2 - number1
    # operate_on_two_numbers(minus_proc)
  end

  def operate_on_two_numbers(&prc)
    number1=@numbers.pop
    number2=@numbers.pop
    @value = prc.call(number1,number2)
  end

end

例如下面的命令

calculator=RPNCalculator.new
calculator.push(5)
calculator.push(8)
calculator.plus
p calculator.value

产生数字“13”。

这是它应该如何工作的,但是代码中似乎有很多重复。例如,“加号”和“减号”的功能基本相同;代码中只有一个“+”和“-”不同。

我想尝试定义一个(私有(private))方法,该方法接受对两个数字(例如“+”、“-”、“*”或“/”)进行操作的操作作为参数。最好使用像快捷方式 .inject(:+) 这样的“快捷方式符号”。

我尝试使用注释掉的行和方法 operate_on_two_numbers,但是当我在这些行中添加注释时,我收到错误“未定义的局部变量或方法‘minus_proc’”。

最佳答案

您可以使用任何 arithmetic operator这里也是一样

def operate_on_two_numbers(a, b, op)
  a.send(op, b)
end

operate_on_two_numbers(1, 2, :+)
#=> 3
operate_on_two_numbers(1, 2, :-)
#=> -1

这是您的完整代码的样子

class RPNCalculator
  attr_accessor :numbers, :value
  def initialize
    @numbers = []
    @value = nil
  end

  def push(number)
    @numbers.push(number)
  end

  def plus
    operate_on_two_numbers(:+)
  end

  def minus
    operate_on_two_numbers(:-)
  end

  private

  def operate_on_two_numbers(op)
    number1=@numbers.pop
    number2=@numbers.pop
    @value = number1.send(op, number2)
  end
end

calculator=RPNCalculator.new
#=> #<RPNCalculator:0x00000002efe460 @numbers=[], @value=nil>
calculator.push(5)
#=> [5]
calculator.push(8)
#=> [5, 8]
calculator.plus
#=> 13
calculator.value
#=> 13

关于ruby - 如何将数学运算(例如 +、-、*、/)作为参数传递给方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37687891/

相关文章:

ruby - 如何让 Ruby JSON 解析器忽略 json_class?

javascript - 如何在 Ruby 中使用 Google map 库?

ruby-on-rails - 如果记录不存在,则使用#update 方法创建新记录

ruby - 如何确定一条记录是迭代中的第一条/最后一条?

ruby-on-rails - 运行基本测试时遇到问题(未知属性错误)

ruby - 如何使用 watir webdriver 检索元素属性列表

ruby - yield self 和 yield 的区别?

ruby - 使用 eval 进行变量赋值

ruby-on-rails - 我如何在拒绝中的嵌套哈希上使用 except

ruby - 为什么秒不转换(strptime/strftime)?