From: Kurt Stephens Date: 2011-01-12T06:05:50+09:00 Subject: [ruby-core:34385] [Ruby 1.9-Feature#4264] General type coercion protocol for Ruby Issue #4264 has been updated by Kurt Stephens. Below is the simple, extensible technique used in Oaklisp. Give each Module a coercer Symbol. Apply the target type's coercer to the object to be coercer. Cost is two message sends. class Module IDENTITY_PROC = lambda { | obj | obj } def coercer unless @coercer @coercer = :"#{self.name}_coercer" define_method(@coercer, &IDENTITY_PROC) end @coercer end end class Object def as(mod) send(mod.coercer, self) end end ######################################### class String define_method(Float.coercer) { | obj | obj.to_f } end class Float define_method(String.coercer) { | obj | obj.to_s } end ######################################### require 'pp' x = 1.23 pp [ x, String.coercer, x.as(String) ] pp [ x, Float.coercer, x.as(Float) ] x = "2.34" pp [ x, String.coercer, x.as(String) ] pp [ x, Float.coercer, x.as(Float) ] ########################## [1.23, :String_coercer, "1.23"] [1.23, :Float_coercer, 1.23] ["2.34", :String_coercer, "2.34"] ["2.34", :Float_coercer, 2.34] ---------------------------------------- http://redmine.ruby-lang.org/issues/show/4264 ---------------------------------------- http://redmine.ruby-lang.org