On Nov 11, 2010, at 4:22 PM, David Kahn wrote:

A little confused: My aim is to get an array of *only* the methods I create in my class. For example, in the class below if I am successful I should see a list of three methods: [:subject, :affiliate, :address].

Well, I think you mean six methods as you'll have the setters also.


I know I can ask for class#methods, but that gives me a lot of inherited methods (see below). I see online that if I call class#methods(false) then I should get my desired response, however when I try this on this class, I get [], empty array. Is there a way to do this? Reason why I want this is so I can iterate my methods on initialize and set default values, to avoid @subect="" @affiliate="".... etc. Of course my real class is much bigger than three methods otherwise would not worry about it.


ruby-1.9.2-p0 > class Entry
ruby-1.9.2-p0 ?>    attr_accessor :subject,
ruby-1.9.2-p0 >                     :affiliate,
ruby-1.9.2-p0 >                     :address
ruby-1.9.2-p0 ?>  end
 => nil
ruby-1.9.2-p0 > e = Entry.new
 => #<Entry:0x2778ec0>
ruby-1.9.2-p0 > e.methods(false)
 => []
ruby-1.9.2-p0 > e.methods
=> [:subject , :subject = , :affiliate , :affiliate = , :address , :address = , :taguri = , :taguri , :to_yaml_style , :to_yaml_properties , :syck_to_yaml , :to_yaml , :blank ?, :present ?, :presence , :duplicable ?, :acts_like ?, :try , :html_safe ?, :` , :returning , :to_param , :to_query , :instance_values , :instance_variable_names , :copy_instance_variables_from , :to_json , :with_options , :as_json , :require_or_load , :require_dependency , :require_association , :load_dependency , :load , :require , :unloadable , :pretty_print , :pretty_print_cycle , :pretty_print_instance_variables , :pretty_print_inspect , :to_sql , :equality_predicate_sql , :inequality_predicate_sql , :bind, :find_correlate_in, :nil?, :===, :=~, :! ~ , :eql ?, :hash , :< = > , :class , :singleton_class , :clone , :dup , :initialize_dup , :initialize_clone , :taint , :tainted ?, :untaint , :untrust , :untrusted ?, :trust , :freeze , :frozen ?, :to_s , :inspect , :methods , :singleton_methods , :protected_methods , :private_methods , :public_methods , :instance_variables , :instance_variable_get , :instance_variable_set , :instance_variable_defined ?, :instance_of ?, :kind_of ?, :is_a ?, :tap , :send , :public_send , :respond_to ?, :respond_to_missing ?, :extend , :display , :method , :public_method , :define_singleton_method , :__id__ , :object_id , :to_enum , :enum_for , :gem , :silence_warnings , :enable_warnings , :with_warnings , :silence_stderr , :silence_stream , :suppress , :class_eval , :pretty_inspect , :require_library_or_gem , :debugger, :breakpoint, :==, :equal?, :!, :! =, :instance_eval, :instance_exec, :__send__]
ruby-1.9.2-p0 >

In your subject line, you almost had it right, try: Entry.instance_methods(false)

Here's a quick implementation of something like you described.

class Entry
  attr_accessor :subject, :affiliate, :address
  def initialize(options={})
    self.class.instance_methods(false).grep(/\=/).each do |name|
      var = name.to_s.sub(/=$/,'').to_sym
      if options.has_key?(var)
        puts "#{name} #{options[var]}"
        self.send(name, options[var])
      else
        puts "no value given for #{var}"
      end
    end
  end
end
irb> Entry.instance_methods(false)
=> [:subject, :subject=, :affiliate, :affiliate=, :address, :address=]
irb> e = Entry.new(:address => '123 Main St.')
no value given for subject
no value given for affiliate
address= 123 Main St.
=> #<Entry:0x1e73f0 @address="123 Main St.">

-Rob

Rob Biedenharn          http://agileconsultingllc.com
[email protected]
+1 513-295-4739
Skype:  rob.biedenharn


--
You received this message because you are subscribed to the Google Groups "Ruby on 
Rails: Talk" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en.

Reply via email to