From: Robert Dober Date: 2007-01-19T18:00:04+09:00 Subject: Re: Hash#open! / Hash#close! ------=_Part_155522_24419114.1169197200319 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline On 1/18/07, Trans wrote: > > > ara.t.howard@noaa.gov wrote: > > On Thu, 18 Jan 2007, Trans wrote: > > > > > hi-- > > > > > > have a look: > > > > > > class Hash > > > > > > def open! > > > class << self > > > @_were_public = public_instance_methods - ['close!'] > > > @_were_public.each { |m| private m } > > > def method_missing(s,*a) > > > if s.to_s[-1,1] == '=' > > > self[s] = a.first > > > else > > > return self[s] > > > end > > > end > > > end > > > end > > > > > > def close! > > > class << self > > > @_were_public.each { |m| public m } > > > @_were_public = nil > > > remove_method(:method_missing) > > > end > > > end > > > > > > end > > > > > > usage: > > > > > > h = {a=>1, :sort_by=>2} > > > h.a #=> NoMethodError > > > h.sort_by #=> LocalJumpError > > > h.open! > > > h.a #=> 1 > > > h.sort_by #=> 2 > > > h.close! > > > h.a #=> NoMethodError > > > h.sort_by #=> LocalJumpError > > > > > > thoughts? improvements? useful? bad-news? > > > > > > T > > > > the only real disadvantage i see is that all these > > > > find_all > > keys > > []= > > each > > object_id > > singleton_methods > > inject > > delete > > value? > > to_hash > > equal? > > taint > > sort_by > > frozen? > > instance_variable_get > > max > > kind_of? > > each_pair > > respond_to? > > to_a > > delete_if > > merge! > > index > > select > > merge > > length > > type > > partition > > protected_methods > > store > > grep > > eql? > > instance_variable_set > > hash > > is_a? > > values > > reject > > to_s > > send > > default > > class > > size > > tainted? > > private_methods > > __send__ > > member? > > default= > > default_proc > > untaint > > find > > each_with_index > > reject! > > id > > invert > > instance_eval > > collect > > inspect > > has_key? > > replace > > all? > > == > > === > > indexes > > entries > > clone > > public_methods > > extend > > each_value > > fetch > > detect > > freeze > > values_at > > zip > > display > > update > > __id__ > > shift > > method > > has_value? > > empty? > > map > > =~ > > methods > > clear > > any? > > rehash > > nil? > > sort > > dup > > indices > > key? > > min > > instance_variables > > include? > > [] > > instance_of? > > each_key > > > > > > cannot be keys since method_missing is use to set the key. an impl like > this > > could get around that > > actually they are made private in my implementation (well, ones with > only alphanumeric characters) and that allows method_missing to get at > them -- yea, one of those esoteric peices of knowledge about ruby one > doesn't readily remember even when it is known. > > T. > > > Just an idea about that, is there already an RCR out about method wrappers. I'll browse the archives just thought that you'd probably know. Cheers Robert -- "The best way to predict the future is to invent it." - Alan Kay ------=_Part_155522_24419114.1169197200319--