From: Austin Ziegler Date: 2006-04-08T06:11:07+09:00 Subject: Re: Simple Question About Deleting Instances On 4/7/06, Nathan Olberding wrote:> zdennis wrote:[...]> It's not so much that I feel strongly as much as that it perplexes me.> I guess I just wanted to make sure my meds haven't been replaced with> crazy pills.>> I thought of this, too: isn't it odd that you can define class> variables in a definition of how instances of a class should work, but> you can't define their accessors? It seems inconsistent. If it's> agreed that this is inconsistent, I'll post something to the site you> mentioned, but if it's that way for a reason, I'll just take your much> appreciated advice, learn that much more, and be that much less of a> newbie. I'm not sure you're clear on the concept (I don't mean that meanly). Consider: class Foo @bar = 5 # the instance variable @bar of (1) @@bar = 5 # the class variable @bar of (2) def initialize @bar = 5 # the instance variable @bar of a Foo instance. (3) end end When you do: class Foo class << self attr_accessor :bar end end You are accessing (1). (2) is not affected. I addressed some of the reasons *why* you wouldn't simply do: attr_accessor :@var in my article on Symbols in January (on the O'Reilly Ruby blog), butremember that attr_accessor defines methods. There's no differencebetween the types of code here. In fact, if you run "ruby -w" on thiscode, you'll get warnings about method redefinitions for the latter two. class Foo attr_accessor :bar def bar; @bar; end def bar=(x); @bar = x; end end Jumping back to the Pickaxe: class Song attr_accessor :duration # in seconds def minutes=(x); @duration = (x * 60).to_i; end def minutes; @duration / 60; end end s = Song.new s.duration = 60 s.minutes # => 1 s.minutes = 2.3 s.duration # => 138 For documentation purposes, I'll sometimes do the following: class Song # The duration of the song in seconds. attr_accessor :seconds # The duration of the song in minutes. attr_accessor :minutes remove_method :minutes, :minutes= def minutes=(m) # :nodoc: @seconds = (x * 60).to_i end def minutes # :nodoc: @duration / 60 end end So using attr_accessor doesn't declare a variable; it declares a pair ofmethods that access and may instantiate a variable, but doesn't have to.And *that* is why doing "attr_accessor :@var" really wouldn't beappropriate. -austin--Austin Ziegler * halostatue@gmail.com * Alternate: austin@halostatue.ca