ruby - 我如何在 Ruby 中构建一个基本的 'English calculator'?

标签 ruby oop method-chaining

所以我目前正在 Ruby 培训优秀 CodeWars网站并遇到了一个有点超出我水平的问题,但如果我可以查看/一个答案并在我的大脑中思考一下,我觉得它真的可以帮助我的编码开发。一种缺失链接类型的交易。

问题是如何构建 Calc 类以实现以下结果:

class Calc
end

Calc.new.one.plus.two             # Should return 3
Calc.new.five.minus.six           # Should return -1
Calc.new.seven.times.two          # Should return 14
Calc.new.nine.divided_by.three    # Should return 3

该类只需要处理单个数字输入 0-9 和 + - */运算符,并且格式将始终是如上所示的 3 种方法链(即数字运算符编号)。

我很想阅读您的一些解决方案,如果您愿意的话,我很乐意阅读您在解决问题时所经历的思考过程。谢谢!

最佳答案

不是最好的方案,但是满足要求:

class Calc
  ENGLISH_TO_OP = Hash[%i{zero one two three four five six seven eight nine}
    .each_with_index.to_a].merge(plus: :+, minus: :-, times: :*, divided_by: :/)

  def method_missing(m)
    if s = ENGLISH_TO_OP[m]
      (@cmd ||= []) << s
      return @cmd[0].send(*@cmd[1..2]) if @cmd.size == 3
      self
    else
      super
    end
  end
end

允许:

2.1.0 :015 > Calc.new.seven.times.two
 => 14 
2.1.0 :016 > Calc.new.nine.divided_by.three
 => 3 
2.1.0 :017 > Calc.new.five.minus.six
 => -1 
2.1.0 :018 > Calc.new.one.plus.two
 => 3 

我不想写很多代码,所以 method_missing 胜过必须定义方法,尽管它可能会有问题,因此我倾向于避免它。哈希查找适用于指定的操作数和操作,each_with_index 可以填充值。将查找到的值分配给条件中的 s 只是懒惰。最后,我可以在初始化程序中初始化 @cmd,但这样代码更少,并且可以防止 @cmd 稍后被另一种方法重置为 nil。

关于ruby - 我如何在 Ruby 中构建一个基本的 'English calculator'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21756423/

相关文章:

ruby - 如何使用 Ruby 在目标站点上抓取、构建 session 和启动页面

java - 如何从网格中获取我单击的组件?

java - 重写子类中的构造函数

函数的 JavaScript 链接方法 - TypeError : (intermediate value). methodName is not a function

php - 获取类方法被调用的次数?

ruby - 如何 reshape Ruby 数组

ruby - 如何打印数组的内容及其位置?

c# - 我应该在一般领域使用什么模式?

ruby - 内联数组切片

ruby-on-rails - 按多列组合对结果集进行分组