你不需要指定你正在求解的角度;它隱含在問題的定義中。如果你開始像這樣的東西(任何類似的錯誤處理省略掉):
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