狠狠撸

狠狠撸Share a Scribd company logo
Ruby 勉強会@札幌?09
                2008?08?23




Measure
単位付き数値ライブラリ
村田 賢太
Ruby 札幌
単位付き数値とは?




     2
単位付き数値とは?
 173 [cm]

 63 [kg]

 376.730 [Ω]

 101,325 [Pa]

 1.602 10?19 [C]

                   2
Measure ライブラリ

 単位付き数値クラスを提供

 異なる単位間の変換を定義可能

 単位付き数値の簡易記法を提供



          3
インストール方法
mrkn-macbook:~ root# gem install -r measure

Bulk updating Gem source index for: http://gems.rubyforge.org

Successfully installed measure-0.1.0

1 gem installed

Installing ri documentation for measure-0.1.0...

Installing RDoc documentation for measure-0.1.0...

mrkn-macbook:~ root#




                                 4
使い方
mrkn-macbook:~ root# irb

irb(main):001:0> require 'measure'

irb(main):002:0> Measure.define_unit :m, :length

irb(main):003:0> Measure.define_unit :cm, :length

irb(main):004:0> Measure(1, :m)

=> #<Measure:0x57d8c @unit=:m, @value=1>

irb(main):005:0> Measure(1, :cm).to_s

=> "1 [cm]"




                                  5
単位変換
irb(main):006:0> Measure.define_conversion :m, :cm => 100

irb(main):007:0> (Measure(1, :m) + Measure(1, :cm)).to_s

=> "1.01 [m]"

irb(main):008:0> Measure.define_unit :in, :length

irb(main):009:0> Measure.define_conversion :in, :cm => 2.54

irb(main):010:0> Measure.define_unit :mm, :length

irb(main):011:0> Measure.define_conversion :m, :mm => 1000

irb(main):012:0> (Measure(210, :mm) - 2*Measure(1, :in)).to_s

=> "159.2 [mm]"



                                 6
マルチホップ変换
  [in]   2.54倍    [cm]



                 100倍
                         [m]
                 1000倍



                  [mm]


                    7
マルチホップ変换
  [in]   2.54倍    [cm]
                         100分の1

     2.54分の1
                 100倍
                             [m]
                 1000倍

                         1000倍
                  [mm]


                    7
マルチホップ変换
    [in]   2.54倍    [cm]
                           100分の1

       2.54分の1
                   100倍
                               [m]
                   1000倍

連結な単位間での                   1000倍
相互変換の経路を            [mm]
幅優先探索で発見
                      7
簡易記法
irb(main):013:0> require 'measure/support'

irb(main):014:0> Measure.form { 1.m - 1.cm }.to_s

=> "0.99 [m]"




                                 8
定义済み単位
   measure/length を require すると次の単
   位が定義され相互変換可能な状態になる
m, meter          in, inch       pt, point, dp, didot_point
cm, centi_meter   ft, feet       bp, big_point
mm, milli_meter   yd, yard       pc, pica
km, kilo_meter
um, micro_meter
nm, nano_meter
                             9
未対応な機能
 多次元単位

 たとえば 1 [kg m / s2] など

  簡易記法なら 1.kg.m.s(?2) かな?

 スケーリング以外の単位変換

 [ C] = 5 ([ F] ? 32) / 9 など

 開発版では対応済み
                 10
Proc による単位変換
irb(main):015:0> Measure.define_unit :deg_c, :temperature

irb(main):016:0> Measure.define_unit :deg_f, :temperature

irb(main):017:0> Measure.define_conversion :deg_c, :deg_f => lambda

{|x| 9.0*x/5.0 + 32 }

irb(main):018:0> Measure.define_conversion :deg_f, :deg_c => lambda

{|x| 5.0*(x - 32)/9.0 }

irb(main):019:0> Measure.form { -40.deg_c.as_deg_f }.to_s

=> "-40.0 [deg_f]"




                                11
Future works

 スケーリング以外の変換を実装したバージョン
 をリリースする

 定义済み単位を増やす

 多次元単位への対応


             12

More Related Content

Measure 単位付き数値ライブラリ