BigDecimal 클래스

BigDecimal 클래스

Ruby 4.0의 BigDecimal 문서 페이지에는 이 페이지에 등록된 것 외에도 실수 연산을 위한 다양한 메서드가 있어요. 여기서는 이 RDoc 페이지가 직접 다루는, JSON 직렬화를 위한 확장 메서드들을 소개할게요. BigDecimal의 기본적인 실수 연산 메서드는 별도 문서를 참고하면 돼요.

출처: Ruby 4.0 API

본문

BigDecimal#as_jsonBigDecimal.json_create 메서드로 BigDecimal 객체를 직렬화·역직렬화할 수 있어요. Marshal 문서도 함께 보세요.

BigDecimal#as_json 메서드는 self를 직렬화해, self를 나타내는 2-요소 해시를 돌려줘요:

require 'json/add/bigdecimal'
x = BigDecimal(2).as_json             # => {"json_class"=>"BigDecimal", "b"=>"27:0.2e1"}
y = BigDecimal(2.0, 4).as_json        # => {"json_class"=>"BigDecimal", "b"=>"36:0.2e1"}
z = BigDecimal(Complex(2, 0)).as_json # => {"json_class"=>"BigDecimal", "b"=>"27:0.2e1"}

JSON.create 메서드는 그런 해시를 역직렬화해 BigDecimal 객체를 돌려줘요:

BigDecimal.json_create(x) # => 0.2e1
BigDecimal.json_create(y) # => 0.2e1
BigDecimal.json_create(z) # => 0.2e1

Class Methods

json_create(object)

as_json을 보세요. 해시를 받아 그 안의 'b' 값을 BigDecimal._load로 복원해 BigDecimal 객체를 돌려줘요.

# File ext/json/lib/json/add/bigdecimal.rb, line 13
def self.json_create(object)
  BigDecimal._load object['b']
end

Public Instance Methods

as_json(*)

self를 직렬화해, self를 나타내는 해시를 돌려줘요.

# File ext/json/lib/json/add/bigdecimal.rb, line 35
def as_json(*)
  {
    JSON.create_id => self.class.name,
    'b'            => _dump.force_encoding(Encoding::UTF_8),
  }
end

to_json(*args)

self를 나타내는 JSON 문자열을 돌려줘요.

require 'json/add/bigdecimal'
puts BigDecimal(2).to_json
puts BigDecimal(2.0, 4).to_json
puts BigDecimal(Complex(2, 0)).to_json

출력:

{"json_class":"BigDecimal","b":"27:0.2e1"}
{"json_class":"BigDecimal","b":"36:0.2e1"}
{"json_class":"BigDecimal","b":"27:0.2e1"}