Решение на Първа задача - температура и химични елементи от Георги Ангелов

Обратно към всички решения

Към профила на Георги Ангелов

Резултати

  • 6 точки от тестове
  • 0 бонус точки
  • 6 точки общо
  • 17 успешни тест(а)
  • 0 неуспешни тест(а)

Код

def degrees_to_celsius(degrees, from_units)
case from_units
when 'C' then degrees
when 'K' then degrees - 273.15
when 'F' then (degrees - 32) / 1.8
end
end
def degrees_from_celsius(degrees, to_units)
case to_units
when 'C' then degrees
when 'K' then degrees + 273.15
when 'F' then degrees * 1.8 + 32
end
end
def convert_between_temperature_units(from_degrees, from_units, to_units)
degrees_in_celsius = degrees_to_celsius(from_degrees, from_units)
degrees_from_celsius(degrees_in_celsius, to_units)
end
SUBSTANCES = {
'water' => {melting_point: 0, boiling_point: 100 },

Интересно ми е защо сте решили ключовете да бъдат символи? Също така не би ли било удачно и самите ключове на SUBSTANCES да са символи? Питам, не за друго, а защото все още се опитвам да си обясня употребата на символ като ключ.

По-добре е да се използват символи за ключове, защото за разлика от String-овете се интернират. Тоест ти ако в 3 различни функции извикваш SUBSTANCES['water'], създаваш 3 пъти String-a 'water'. Ако използваш символи, такъв проблем няма. По условие на функцията се подава елемента като String, а не като символ. Разбира се може да се мине през някакво преобразуване до символ, но това усложнява решението ненужно.

Някой да ме поправи, ако греша брутално. :)

@Петър е прав :)

Ето едно хубаво бабешко правило - ако нещото го има в кода, използва се само в кода и можеш да го замениш с константа, най-вероятно искаш да е символ.

Тук ключовете са стрингове само, защото функцията приема стринг като аргумент. Тогава е безсмислено ключовете да са символи, защото постоянно ще трябва да преобразуваме (с to_sym).

'ethanol' => {melting_point: -114, boiling_point: 78.37},
'gold' => {melting_point: 1_064, boiling_point: 2_700},
'silver' => {melting_point: 961.8, boiling_point: 2_162},
'copper' => {melting_point: 1_085, boiling_point: 2_567}
}
def melting_point_of_substance(substance, units)
degrees_from_celsius(SUBSTANCES[substance][:melting_point], units)
end
def boiling_point_of_substance(substance, units)
degrees_from_celsius(SUBSTANCES[substance][:boiling_point], units)
end

Лог от изпълнението

.................

Finished in 0.01996 seconds
17 examples, 0 failures

История (1 версия и 3 коментара)

Георги обнови решението на 10.10.2016 23:33 (преди около 4 години)

+def degrees_to_celsius(degrees, from_units)
+ case from_units
+ when 'C' then degrees
+ when 'K' then degrees - 273.15
+ when 'F' then (degrees - 32) / 1.8
+ end
+end
+
+def degrees_from_celsius(degrees, to_units)
+ case to_units
+ when 'C' then degrees
+ when 'K' then degrees + 273.15
+ when 'F' then degrees * 1.8 + 32
+ end
+end
+
+def convert_between_temperature_units(from_degrees, from_units, to_units)
+ degrees_in_celsius = degrees_to_celsius(from_degrees, from_units)
+
+ degrees_from_celsius(degrees_in_celsius, to_units)
+end
+
+SUBSTANCES = {
+ 'water' => {melting_point: 0, boiling_point: 100 },

Интересно ми е защо сте решили ключовете да бъдат символи? Също така не би ли било удачно и самите ключове на SUBSTANCES да са символи? Питам, не за друго, а защото все още се опитвам да си обясня употребата на символ като ключ.

По-добре е да се използват символи за ключове, защото за разлика от String-овете се интернират. Тоест ти ако в 3 различни функции извикваш SUBSTANCES['water'], създаваш 3 пъти String-a 'water'. Ако използваш символи, такъв проблем няма. По условие на функцията се подава елемента като String, а не като символ. Разбира се може да се мине през някакво преобразуване до символ, но това усложнява решението ненужно.

Някой да ме поправи, ако греша брутално. :)

@Петър е прав :)

Ето едно хубаво бабешко правило - ако нещото го има в кода, използва се само в кода и можеш да го замениш с константа, най-вероятно искаш да е символ.

Тук ключовете са стрингове само, защото функцията приема стринг като аргумент. Тогава е безсмислено ключовете да са символи, защото постоянно ще трябва да преобразуваме (с to_sym).

+ 'ethanol' => {melting_point: -114, boiling_point: 78.37},
+ 'gold' => {melting_point: 1_064, boiling_point: 2_700},
+ 'silver' => {melting_point: 961.8, boiling_point: 2_162},
+ 'copper' => {melting_point: 1_085, boiling_point: 2_567}
+}
+
+def melting_point_of_substance(substance, units)
+ degrees_from_celsius(SUBSTANCES[substance][:melting_point], units)
+end
+
+def boiling_point_of_substance(substance, units)
+ degrees_from_celsius(SUBSTANCES[substance][:boiling_point], units)
+end