Лазар обнови решението на 11.10.2016 00:11 (преди около 8 години)
+def convert_between_temperature_units(x, t1, t2)
+ case t1
+ when t2
+ x
+ when 'C'
+ if t2 == 'F'
+ x * 1.8 + 32
+ else
+ x + 273.15
+ end
Можеш ли да се сетиш как да разделиш тези преобразувания на две стъпки, така че да не се налага да имаш вложени условия?
+ when 'F'
+ if t2 == 'K'
+ (x + 459.67) * (5 / 9)
+ else
+ (x - 32) / 1.8
+ end
+ when 'K'
+ if t2 == 'C'
+ x - 273.15
+ else
+ x * (9 / 5) - 459.67
+ end
+ end
+end
+
+def melting_point_of_substance(substance, unit)
+ case substance
+ when 'water'
+ convert_between_temperature_units(0, 'C', unit)
+ when 'ethanol'
+ convert_between_temperature_units(-114, 'C', unit)
+ when 'gold'
+ convert_between_temperature_units(1_064, 'C', unit)
+ when 'silver'
+ convert_between_temperature_units(961.8, 'C', unit)
+ when 'copper'
+ convert_between_temperature_units(1_085, 'C', unit)
Тук има две неща, които може да подобриш:
- Вместо
case
може да ползваш нещо, което показахме в сряда. Това нещо може да го изкараш в константа извън функцията. Ще стане много по-чисто. - Има много повторения на
convert_between_temperature_units(..., 'C', unit)
. Спомни си, че всяко нещо е израз, включително иwhen
:)
+ end
+end
+
+def boiling_point_of_substance(substance, unit)
+ case substance
+ when 'water'
+ convert_between_temperature_units(100, 'C', unit)
+ when 'ethanol'
+ convert_between_temperature_units(78.38, 'C', unit)
+ when 'gold'
+ convert_between_temperature_units(2_700, 'C', unit)
+ when 'silver'
+ convert_between_temperature_units(2_162, 'C', unit)
+ when 'copper'
+ convert_between_temperature_units(2_567, 'C', unit)
+ end
+end