所以我目前正在 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/