Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Could you tell me if this is good meta programming style?

Reply
Thread Tools

Could you tell me if this is good meta programming style?

 
 
Vincent Foley
Guest
Posts: n/a
 
      04-29-2005
Hi everyone,

I finished playing yet another game of Chrono Trigger the other day,
and I thought I would look at how I could implement a simple Character
system in Ruby. I have the following initialize method, but I would
like to be sure it's not extremely bad style:

class Character
attr_accessor :strength, :magic, :defense, :magic_defense

def initialize(args = {})
args.each do |k, v|
instance_variable_set("@#{k}", v) if respond_to?(k)
end

methods.grep(/\w=$/).each { |setter|
getter = setter[0..-2]
if send(getter).nil?
send(setter, 0)
end
}
end
end

So, if I added a :critical_rate accessor, I wouldn't need to modify
anything else in the initialize method. Also, I don't want nil in any
attribute. Is this good style? Are there other (maybe better) ways to
accomplish this? Thank you.

 
Reply With Quote
 
 
 
 
Ara.T.Howard@noaa.gov
Guest
Posts: n/a
 
      04-29-2005
On Fri, 29 Apr 2005, Vincent Foley wrote:

> Hi everyone,
>
> I finished playing yet another game of Chrono Trigger the other day,
> and I thought I would look at how I could implement a simple Character
> system in Ruby. I have the following initialize method, but I would
> like to be sure it's not extremely bad style:
>
> class Character
> attr_accessor :strength, :magic, :defense, :magic_defense
>
> def initialize(args = {})
> args.each do |k, v|
> instance_variable_set("@#{k}", v) if respond_to?(k)
> end
>
> methods.grep(/\w=$/).each { |setter|
> getter = setter[0..-2]
> if send(getter).nil?
> send(setter, 0)
> end
> }
> end
> end
>
> So, if I added a :critical_rate accessor, I wouldn't need to modify
> anything else in the initialize method. Also, I don't want nil in any
> attribute. Is this good style? Are there other (maybe better) ways to
> accomplish this? Thank you.


using my attributes module this would be

harp:~ > cat a.rb
require 'yaml'
require 'attributes'

class Character
attributes %w( strength magic defense magic_defense )

def initialize args = {}
args.each{|k,v| send k, v if respond_to? k}
reader_attributes.each{|at| send at, 0 unless send at}
end
end

c = Character::new 'strength' => 4, 'magic' => 2
y c

harp:~ > ruby a.rb
--- !ruby/object:Character
defense: 0
magic: 2
magic_defense: 0
strength: 4

this works because an attribute's reader delegates to the writer if called with
an argument (send at, 0).

not sure if this is 'better' but it's shorter

cheers.

-a
--
================================================== =============================
| email :: ara [dot] t [dot] howard [at] noaa [dot] gov
| phone :: 303.497.6469
| renunciation is not getting rid of the things of this world, but accepting
| that they pass away. --aitken roshi
================================================== =============================

 
Reply With Quote
 
 
 
 
Ilmari Heikkinen
Guest
Posts: n/a
 
      04-29-2005
la, 2005-04-30 kello 00:14, Vincent Foley kirjoitti:
> Hi everyone,
>
> I finished playing yet another game of Chrono Trigger the other day,
> and I thought I would look at how I could implement a simple Character
> system in Ruby. I have the following initialize method, but I would
> like to be sure it's not extremely bad style:
>
> class Character
> attr_accessor :strength, :magic, :defense, :magic_defense
>
> def initialize(args = {})
> args.each do |k, v|
> instance_variable_set("@#{k}", v) if respond_to?(k)
> end
>
> methods.grep(/\w=$/).each { |setter|
> getter = setter[0..-2]
> if send(getter).nil?
> send(setter, 0)
> end
> }
> end
> end
>
> So, if I added a :critical_rate accessor, I wouldn't need to modify
> anything else in the initialize method. Also, I don't want nil in any
> attribute. Is this good style? Are there other (maybe better) ways to
> accomplish this? Thank you.


Hello,
I've been using a pretty similar class for my config needs, maybe the
biggest difference is that I'm using a default_config method to get the
default values and to make it work properly with subclassing.

I quite like the respond_to?-check you've got there, think I'll extend
mine by raising a name error if the setter doesn't exist.. or just use a
config block more often

Anyhow, here's the class:

class Configurable

def initialize(config = {}, &optional_config_block)
config = default_config.merge(config)
config.each{|k,v| instance_variable_set("@#{k}", v)}
optional_config_block.call(self) if block_given?
end

def default_config
{}
end

end

#subclassing:

class Foo < Configurable
attr_accessor :foo

def default_config
super.merge({
:foo => 10
})
end
end

Foo.new :foo => 5
Foo.new{|f| f.foo = 5 }

class FooBar < Foo
attr_accessor :bar

def default_config
super.merge({
:bar => 20
})
end
end

fb = FooBar.new
fb.foo #=> 10
fb.bar #=> 20




 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Some people tell that at present, most web hosting servers supportall kinds of programming language, some people tell me that many web hostingserver don't support Java, What is the truth? Erwin Moller Java 3 05-07-2008 05:09 PM
Could you give me some good websites about CPP IO programming? 322322 C++ 3 03-30-2008 10:25 AM
Meta-Meta-Programming, revisited Erik Veenstra Ruby 21 07-25-2006 10:26 PM
Meta-Meta-Programming Erik Veenstra Ruby 29 02-08-2006 08:22 PM
META NAME and META HTTP-EQUIV Nym Pseudo HTML 1 09-26-2003 09:13 AM



Advertisments