Виктор обнови решението на 15.10.2016 13:11 (преди около 8 години)
+CONVERTER = {
+ C: {
Едно дребно и едно по-концпетуално нещо тук:
- Имената на ключовете в хешовете е по-добре да са в
snake_case
. - Може да се замислиш за алтернативен подход в конвертирането, вместо да изреждаш формули от всяка мерна единица до всяка друга. Например да конвертираш на 2 стъпки, минавайки през избрана от теб междинна мерна единица. Например Kelvin. Така ще правиш едно смятане повече, но пък ще ти трябват само формули от трите до Келвин, както и от Келвин до трите. C -> F би се извеждало чрез C -> K -> F, вместо чрез собствена формула.
+ C: -> (c) { c },
+ F: -> (c) { (c * 9.0 / 5) + 32 },
+ K: -> (c) { c + 273.15 }
+ },
+ F: {
+ C: -> (f) { (f - 32) * 5.0 / 9 },
+ F: -> (f) { f },
+ K: -> (f) { (f - 32) * 5.0 / 6 + 273.15 }
+ },
+ K: {
+ C: -> (k) { (k - 273.15) * 9.0 / 5 + 32 },
+ F: -> (k) { k - 273.15 },
+ K: -> (k) { k }
+ }
+}
+
+MELTING_POINTS_CELSIUS = {
+ water: 0,
+ ethanol: -114,
+ gold: 1_064,
+ silver: 961.8,
+ copper: 1_085
+}
+
+BOILING_POINTS_CELSIUS = {
Супер имена, казват точно какво съдържат хешовете. Също е добре че са дефинирани като константи извън методите.
+ water: 100,
+ ethanol: 78.37,
+ gold: 2_700,
+ silver: 2_162,
+ copper: 2_567
+}
+
+def convert_between_temperature_units(degrees, from_unit, to_unit)
+ CONVERTER[from_unit.to_sym][to_unit.to_sym].call(degrees)
Може да ползваш стрингове за ключове на хешовете, за да си спестиш викането на to_sym
всеки път. Не е фатално че ще се наложи да ползваш стария синтаксис с "ракетка" (=>
вместо :
).
+end
+
+def melting_point_of_substance(substance, unit)
+ CONVERTER[:C][unit.to_sym].call(MELTING_POINTS_CELSIUS[substance.to_sym])
+end
+
+def boiling_point_of_substance(substance, unit)
+ CONVERTER[:C][unit.to_sym].call(BOILING_POINTS_CELSIUS[substance.to_sym])
+end
Супер имена, казват точно какво съдържат хешовете. Също е добре че са дефинирани като константи извън методите.