Вам не нужно указывать какой угол вы решаете; это подразумевается в определении проблемы. Если вы начнете с чего-то подобного (что-то похожее на обработку ошибок, вылетает):
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
Технически, вы могли бы решить только после определения, что значение не установлено, но ме.
> 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