recommended way to indent

  • Follow


At several occasions I wonder how to best indent Ruby code.
I am curious to how _you_ indent Ruby code ?

For instance converting Array into variables, with
many/long variables it can get unreadable.

( node, 
  @input, 
  @parent_nodes, 
  @registers    ) = @resume_stack.pop   


The opposite push operation could be indented like this:

@resume_stack.push([
  node, 
  input, 
  @parent_nodes.map_clone,
  @registers.clone
]) 


Classes which has to be initialized with a bunch of
arguments: 

def initialize(
  number_of_registers, 
  input, 
  integrity_iterator=nil)


--
Simon Strandgaard
0
Reply neoneye (532) 12/29/2003 10:09:16 AM

On Monday, December 29, 2003, 9:16:48 PM, Simon wrote:

> At several occasions I wonder how to best indent Ruby code.
> I am curious to how _you_ indent Ruby code ?

> For instance converting Array into variables, with
> many/long variables it can get unreadable.

> ( node, 
>   @input, 
>   @parent_nodes, 
>   @registers    ) = @resume_stack.pop   

I would tend to encapsulate the four values in an object rather than
splatter assignments all over the place.

> Classes which has to be initialized with a bunch of
> arguments: 

> def initialize(
>   number_of_registers, 
>   input, 
>   integrity_iterator=nil)

def initialize(nregisters, input, integrity_iterator=nil)

That's not too long :)  Any longer and I'd consider an alternative
strategy.

Regarding your actual indenting, though, I would do it the same way.

Gavin




0
Reply gsinclair1 (862) 12/29/2003 1:15:25 PM


On Mon, 29 Dec 2003, Simon Strandgaard wrote:

> Date: Mon, 29 Dec 2003 11:09:16 +0100
> From: Simon Strandgaard <neoneye@adslhome.dk>
> Newsgroups: comp.lang.ruby
> Subject: recommended way to indent
> 
> At several occasions I wonder how to best indent Ruby code.
> I am curious to how _you_ indent Ruby code ?
> 
> For instance converting Array into variables, with
> many/long variables it can get unreadable.
> 
> ( node, 
>   @input, 
>   @parent_nodes, 
>   @registers    ) = @resume_stack.pop   


i typically do

  node, input, parent_nodes, registers = 
    resume_stack.pop   

note the lack of '@', i try hard to never use it outside of initialize and
instead use

  attr :node
  attr :input

etc. to avoid it.  not that fastest - but easier to read

> The opposite push operation could be indented like this:
> 
> @resume_stack.push([
>   node, 
>   input, 
>   @parent_nodes.map_clone,
>   @registers.clone
> ]) 

  resume_stack.push node, 
                    input, 
                    parent_nodes.map_clone,
                    registers.clone

or, if args too long/too indended:

  args =
    node, 
    input, 
    parent_nodes.map_clone,
    registers.clone

  resume_stack.push *args 



> 
> 
> Classes which has to be initialized with a bunch of
> arguments: 
> 
> def initialize(
>   number_of_registers, 
>   input, 
>   integrity_iterator=nil)

i do this a _lot_ for initializers with lots of args:

  class Array
    def hashify
      inject({}){|h,o| h.update o}
    end
  end


  class C
    attr :opts
    attr :foo
    attr :bar

    def initialize(*args)
      @opts = args.hashify
      @foo = opts[:foo]
      @bar = opts[:bar]
    end
  end

  opts = Hash[
    :foo => 42,
    :bar => 42.0,
  ]

  c = C.new opts
  c = C.new opts, :foo => 'note that foo is overridden here!!!'

though i do _not_ always put #hashify in Array, sometimes it is a class or
instance method...

this is really useful when you want to pass many of the args to initialize to
subsequent calls (deep class structure), since you can then simply:

  class C
    attr :opts
    attr :b

    def initialize(*opts)
      @opts = opts.hashify
      b = B.new opts, :key => 'overridden'
    end
  end

  class B
    attr :opts
    def initialize(*opts)
      @opts = opts.hashify
      ...
    end
  end

this comes in _really_ handy when you decide, after much developent, that you
need a new var deep in a series of calls - with this method, you simply add it
to the top level.  most of all i like how long initializers tend to read
though:

  c = C.new :label  => 'value',
            :width  => 42,
            :height => 42.0,
            :border => 'raised', 
            :ipad   => 2.0, 
            :color  => 0x00ff00,

if you get the 'Align' macro for gvim lining up the '=>' is super easy too...

etc.
etc.
  

-a
-- 

ATTN: please update your address books with address below!

===============================================================================
| EMAIL   :: Ara [dot] T [dot] Howard [at] noaa [dot] gov
| PHONE   :: 303.497.6469
| ADDRESS :: E/GC2 325 Broadway, Boulder, CO 80305-3328
| STP     :: http://www.ngdc.noaa.gov/stp/
| NGDC    :: http://www.ngdc.noaa.gov/
| NESDIS  :: http://www.nesdis.noaa.gov/
| NOAA    :: http://www.noaa.gov/
| US DOC  :: http://www.commerce.gov/
|
| The difference between art and science is that science is what we
| understand well enough to explain to a computer.  
| Art is everything else.  
|   -- Donald Knuth, "Discover"
|
| /bin/sh -c 'for l in ruby perl;do $l -e "print \"\x3a\x2d\x29\x0a\"";done' 
===============================================================================

0
Reply ahoward (82) 12/29/2003 3:26:42 PM

Hi!

* Simon Strandgaard:
> At several occasions I wonder how to best indent Ruby code.
> I am curious to how _you_ indent Ruby code ?
> 
> ( node, 
>   @input, 
>   @parent_nodes, 
>   @registers    ) = @resume_stack.pop   

(
  node,
  @input,
  @parent_nodes,
  @registers
)               = @resume_stack.pop

This calls for a font that makes it easy to distinguish between
ordinary parentheses and curly braces. I sometimes indent the
assignment but not always. Depends on how obvious the RHS is.

> @resume_stack.push([
>   node, 
>   input, 
>   @parent_nodes.map_clone,
>   @registers.clone
> ]) 

I sometimes do it in the same way but I also use

@resume_stack.push(
  [
    node,
    input,
    @parent_nodes.map_clone,
    @registers.clone,
  ]
)

depending on how important it is that the data is an array.

Please note the colon after @registers.clone - I did add it on
purpose...

> def initialize(
>   number_of_registers, 
>   input, 
>   integrity_iterator=nil)

usually:

def initialize( number_of_registers,
                input,
                integrity_iterator=nil
              )

Space. The final frontier. These are the adventures of the U.S.S.
Ruby that boldly indents what noone has indented before >;->

Josef 'Jupp' SCHUGT
-- 
http://oss.erdfunkstelle.de/ruby/    -     German comp.lang.ruby-FAQ
http://rubyforge.org/users/jupp/     -     Ruby projects at Rubyforge


0
Reply jupp (454) 12/30/2003 8:54:41 PM

3 Replies
30 Views

(page loaded in 0.134 seconds)


Reply: