From: Trans Date: 2008-11-26T22:13:56+09:00 Subject: Re: attr_reader, default attribute value, and rdoc of attrib On Nov 26, 7:17 am, Brian Candler wrote: > dkmd_nielsen wrote: > > What I want to do is create an attribute, allow it to have a default > > value, and have the attribute documented as such (and not as a method) > > with rdoc.  So, would the proper syntax for accomplishing this > > elementary feat be: > > >    # Field (row) delimiter.  Default is a comma. > >    attr_reader fld_delimiter > > >    # :call-seq: > >     #   fld_delimiter > >     # > >     # Returns the field (column) delimiter.  Default is comma. > >     def fld_delimiter #:nodoc: > >       !@fld_delimiter.nil? ? @fld_delimiter : (@fld_delimiter = ',') > >     end > > >     # :call-seq: > >     #   fld_delimiter(String) > >     # > >     # Assign a field (column) delimiter. > >     def fld_delimiter=(d) > >       @fld_delimiter = d > >     end > > I would tidy this up as: > > attr_accessor :fld_delimiter > def fld_delimiter #:nodoc: >   @fld_delimiter ||= ',' > end > > That assumes you never want to assign nil or false as a fld_delimiter. > If you do, then > > attr_accessor :fld_delimiter > def fld_delimiter #:nodoc >   @fld_delimiter = ',' unless defined? @fld_delimiter >   @fld_delimiter > end > > Another option is never to assign when defaults are being used: using a > constant lets you document the default. > > DEFAULT_FLD_DELIMITER = ','.freeze > attr_accessor :fld_delimiter > def fld_delimiter >   defined? @fld_delimiter ? @fld_delimiter : DEFAULT_FLD_DELIMITER > end > > However I think it would be simpler just to set @fld_delimiter=',' in > your object's initialize method. Brain is right on. The archetypal Ruby best-practice will look like this: DEFAULT_FLD_DELIMITER = ','.freeze attr_accessor :fld_delimiter def initialize @fld_delimiter = DEFAULT_FLD_DELIMITER end