你不需要指定你正在求解的角度;它隐含在问题的定义中。如果你开始像这样的东西(任何类似的错误处理省略掉):
class Triangle
def initialize h
h.keys.each { |key| instance_variable_set "@#{key}".to_sym, h[key] }
end
def to_s
"a=#{@a}, b=#{@b}, c=#{@c}"
end
def solve
angle = instance_variables.inject(180) { |v, a| v -= instance_variable_get(a) }
[:@a, :@b, :@c].each {|s| instance_variable_set(s, angle) unless instance_variable_defined? s }
self
end
end
然后:
pry(main)> t = Triangle.new :a => 20, :c => 30
=> a=20, b=, c=30
pry(main)> t.solve
=> a=20, b=130, c=30
pry(main)>
你也可以返回/指示哪个角度实际上是解决了,如果需要的话。
这实际上并不是避免和if
声明,这是您的具体问题。它不需要明确地拼出它们中的每一个,我将其作为问题的意图。
如果你真的需要“解决”,你可以做补充:
def solve_for sym
solve
instance_variable_get("@#{sym}".to_sym)
end
从技术上讲,你能解决只能确定值未设置,但MEH后。
> t = Triangle.new :a => 20, :c => 30
=> a=20, b=, c=30
> t.solve_for :b
=> 130
> t
=> a=20, b=130, c=30
> t = Triangle.new :a => 20, :c => 30
=> a=20, b=, c=30
> t.solve_for :a
=> 20
> t
=> a=20, b=130, c=30
这完全取决于;是基于价值的决定,还是字面上依赖于符号? – 2011-12-22 16:44:06
它总是有助于展示您为此编写的内容,而不是让我们其他人尝试将代码可视化并对其进行改进。 – 2011-12-22 16:46:57
我已经更新了代码,希望更有意义。它基本上是试图解决三个角度,当两个已知和第三个失踪,但所有三个必须加起来180. – 2011-12-22 16:48:58