Мила обнови решението на 13.10.2016 22:51 (преди около 8 години)
+def convert_between_temperature_units(degrees, unit_from, unit_to)
+ case [unit_from, unit_to]
+ when ['C', 'F']
+ (degrees * 1.8) + 32
+ when ['C', 'K']
+ degrees + 273.15
+ when ['C', 'C']
+ degrees
+ when ['F', 'F']
+ degrees
+ when ['F', 'K']
+ (degrees - 32.0) * Rational(5, 9) + 273.15
Няма смисъл от този Rational тук. Искаме float число за резултат, не рационално. Още, долу си ползвал направо 1.8
+ when ['F', 'C']
+ (degrees - 32.0) * Rational(5, 9)
+ when ['K', 'F']
+ (degrees - 273.15) * 1.8 + 32
+ when ['K', 'K']
+ degrees
+ when ['K', 'C']
Хм, доста интересно използване на when-а :)
Тук имаш N * N случая. Можеш ли да се сетиш как може да го направиш с N + N случая? Тоест, вместо switch по комбинации (с наредба) от две неща, да имаш два switch-а по един вид нещо.
В този вид, ако решиш да добавиш нова мерна единица ще трябва да сложиш 7 нови случая. В другия ще трябва да сложиш 2.
+ degrees - 273.15
+ end
+end
+
+def melting_point_of_substance(substance, unit)
+ points_of_melting = { 'water' => 0, 'ethanol' => -114, 'gold' => 1_064, 'silver' => 961.8, 'copper' => 1_085 }
Points of melting не е правилен английски. Трябва да е melting points.
Аз бих изкарал това в една константа над функцията + всяко нещо да е на отделен ред. Ще стане много по-ясно разделението между логика и данни. Пък и по-ясно за окото.
+ convert_between_temperature_units(points_of_melting[substance], 'C', unit)
+end
+
+def boiling_point_of_substance(substance, unit)
+ points_of_boiling = { 'water' => 100, 'ethanol' => 78.37, 'gold' => 2_700, 'silver' => 2_162, 'copper' => 2_567 }
+ convert_between_temperature_units(points_of_boiling[substance], 'C', unit)
+end