This project is closed and read-only.
Backport #5270 » date-once.patch
| lib/date.rb | ||
|---|---|---|
|
class << self
|
||
|
def once(*ids) # :nodoc:
|
||
|
for id in ids
|
||
|
module_eval <<-"end;"
|
||
|
alias_method :__#{id.to_i}__, :#{id.to_s}
|
||
|
private :__#{id.to_i}__
|
||
|
def #{id.to_s}(*args, &block)
|
||
|
(@__#{id.to_i}__ ||= [__#{id.to_i}__(*args, &block)])[0]
|
||
|
end
|
||
|
end;
|
||
|
def once(*meths)
|
||
|
meths.each do |meth|
|
||
|
# Alias
|
||
|
orig_meth = '__nonmemoized_' + meth.to_s
|
||
|
alias_method orig_meth, meth
|
||
|
# Redefine
|
||
|
define_method(meth) do |*args|
|
||
|
# Get cache
|
||
|
@__memoization_cache ||= {}
|
||
|
@__memoization_cache[meth] ||= {}
|
||
|
# Recalculate or fetch
|
||
|
cache = @__memoization_cache[meth]
|
||
|
if !cache.has_key?(args)
|
||
|
cache[args] = send(orig_meth, *args)
|
||
|
else
|
||
|
result = cache[args]
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
| ... | ... | |
|
#
|
||
|
# Using one of the factory methods such as Date::civil is
|
||
|
# generally easier and safer.
|
||
|
def initialize(ajd=0, of=0, sg=ITALY) @ajd, @of, @sg = ajd, of, sg end
|
||
|
def initialize(ajd=0, of=0, sg=ITALY)
|
||
|
@ajd, @of, @sg = ajd, of, sg
|
||
|
@__memoization_cache = {}
|
||
|
end
|
||
|
# Get the date as an Astronomical Julian Day Number.
|
||
|
def ajd() @ajd end
|
||
| test/ruby/test_date.rb | ||
|---|---|---|
|
require 'test/unit'
|
||
|
require 'date'
|
||
|
class TestDate < Test::Unit::TestCase
|
||
|
def test_freeze
|
||
|
foo = Date.new
|
||
|
foo.freeze
|
||
|
foo.year
|
||
|
end
|
||
|
end
|
||
- « Previous
- 1
- 2
- Next »