Как использовать значения с единицами измерения в Ruby? - PullRequest
2 голосов
/ 21 февраля 2012

Какой хороший способ использовать, например, температуру в Ruby, не путаясь с используемыми единицами измерения?

Существует ли общепринятый способ решения этой проблемы?синтаксис, чтобы он был наиболее понятным и легким для чтения?

Каков наилучший способ сообщить, какие единицы ожидает данная функция или как гарантировать, что она получает правильные?

Ответы [ 5 ]

0 голосов
/ 27 февраля 2014

Я реализовал гем, который обрабатывает преобразование единиц и математику - Unitwise . Он основан на Унифицированном коде для единиц измерения ( UCUM ), стандарте для представления единиц в информатике. Unitwise может количественно определять, преобразовывать и выполнять математические вычисления для многих единиц, включая температуры:

require 'unitwise'

temp = 22.convert_to('degree Celsius') 
# => #<Unitwise::Measurement 22 degree Celsius>

temp.convert_to("degree Fahrenheit")
# => #<Unitwise::Measurement 71.59999999999997 degree Fahrenheit>

Поддерживаются также шкалы Кельвина и Ранкина.

0 голосов
/ 23 февраля 2012

Я нашел следующие два драгоценных камня, которые обеспечивают то, что я искал:

Оба драгоценных камня предоставляют способ создавать юниты и работать с ними (иначе говоря, умножать, добавлять и т. Д.). Таким образом, функция может проверить, получила ли она единицу, и таким образом выполнить свои операции в правильной единице измерения.

0 голосов
/ 21 февраля 2012

В конечном счете, если вы запрашиваете пользовательский ввод температуры в какой-то момент в вашем приложении, вам также нужно будет попросить их также указать единицу измерения. Вы не можете полагаться на то, что они всегда вводят правильное значение в C / F / K / независимо от того, что вы решили использовать.

В фоновом режиме вы либо делаете то, что уже было предложено, и передаете объекты «Температура», которые могут возвращать температуру в любой единице, или более внимательно относитесь к последовательному использованию одной единицы и более четко задаете ее в именовании переменных:

def jacket_needed?(celcius)
  celcius < 10
end
0 голосов
/ 21 февраля 2012

Я не знаю о общепринятом способе сделать это, но я бы создал класс для обработки каждой меры. Eg.:

class Temperature
  def initialize value, unit = :K
    # convert the value into a internal unit, e.g. Kelvin,
    # to store internally
  end
  def value unit = :K
    # convert the value to the desired unit and return it.
  end
end

class Length
  def initialize value, unit = :m
    #...
  end
  #...
end

class TimeLength
  def initialize value, unit = :s
    #...
  end
  #...
end

и т.д.

0 голосов
/ 21 февраля 2012

Длинный ответ будет состоять в том, чтобы создать класс для температуры, а затем подкласс его для Ferienheit, Celcius и Kelvin.И пусть они все реализуют функцию, которая возвращает их значение в одном или другом.

Так что, если вы хотите основать свою систему на Ferienheit, вы можете предложить им всем реализовать метод toFerienheit, независимо от того, какой тип измерения вы используете.Я бы сказал, у вас всегда был бы способ вернуть их к одной дистиллированной температуре.

Это лучшее, что я могу сделать для такого рода неопределенного вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...