Module: Decentworks::HexdigestSupport::NumericLike
- Included in:
- BigDecimal, Float, Integer, Rational
- Defined in:
- lib/decentworks/hexdigest_support/numeric_like.rb
Overview
数を表す型に共通の入力生成
MEMO: Integer / Float / Rational / BigDecimalへincludeする。Rubyのクラス階層上は それぞれ別の型だが、いずれも「数」を表す点は同じなのでダイジェストの入力は 共通化する
Instance Method Summary collapse
-
#to_hexdigest_rational ⇒ Object
正規化に用いる有理数.
-
#to_hexdigest_source ⇒ Object
ハッシュ値を求めるためのオリジナルの値.
-
#to_hexdigest_type ⇒ Object
ハッシュ値化に用いる型の識別子.
Instance Method Details
#to_hexdigest_rational ⇒ Object
正規化に用いる有理数
MEMO: 十進として解釈すべき型(Float)はこのメソッドを上書きする
41 |
# File 'lib/decentworks/hexdigest_support/numeric_like.rb', line 41 def to_hexdigest_rational = to_r |
#to_hexdigest_source ⇒ Object
ハッシュ値を求めるためのオリジナルの値
MEMO: 有理数へ寄せてから文字列化する。#to_sの表記はクラスごとに異なり (1.5は"1.5"、BigDecimal("1.5")は"0.15e1")、同じ数でも別の値になってしまう
MEMO: NaNと±Infinityは有理数にできないため#to_sをそのまま使う。FloatとBigDecimalの どちらも"NaN" / "Infinity" / "-Infinity"を返すので、型を寄せても表記は揃う
MEMO: NaN同士は#==がfalseになるがダイジェストは一致する。値として区別する術が ない以上、インスタンスごとに異なる入力を作るよりは同一として扱う
32 33 34 35 36 |
# File 'lib/decentworks/hexdigest_support/numeric_like.rb', line 32 def to_hexdigest_source return to_s unless finite? ::Decentworks::HexdigestSupport.format_rational(to_hexdigest_rational) end |
#to_hexdigest_type ⇒ Object
ハッシュ値化に用いる型の識別子
MEMO: 実装クラス名ではなく"Numeric"へ正規化する。Railsでは同じ数が経路によって 別のクラスで現れる(decimalカラムはBigDecimal、integerカラムやJSONの整数は Integer、JSONの小数はFloat)ため、クラス名を型にすると入力経路の違いだけで ダイジェストが割れてしまう
MEMO: 「型で区別する」という本gemの原則に対する意図的な例外。TimeLikeで Time / DateTime / TimeWithZoneを"Time"へ寄せているのと同じ割り切り
20 |
# File 'lib/decentworks/hexdigest_support/numeric_like.rb', line 20 def to_hexdigest_type = "Numeric" |