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

Instance Method Details

#to_hexdigest_rationalObject

正規化に用いる有理数

MEMO: 十進として解釈すべき型(Float)はこのメソッドを上書きする



41
# File 'lib/decentworks/hexdigest_support/numeric_like.rb', line 41

def to_hexdigest_rational = to_r

#to_hexdigest_sourceObject

ハッシュ値を求めるためのオリジナルの値

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_typeObject

ハッシュ値化に用いる型の識別子

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"