John Maclean wrote:
> Is i) and ii) just two different methods for initialising?

No.

> i)
>  class Song
>   attr_reader :name, :artist, :
>  end

Creates attr reader methods but does nothing about values.

> ii)
> def initialize(foo, blah, haha)
>   @foo = foo
>   @blah = blah
>   @haha = haha
> end

Initializes values but does not create reader methods.

You can make your life easier by using Struct:

Song = Struct.new(:name, :artist)
s1 = Song.new "foo", "bar"

Struct will create setters, getters and an appropriate constructor
(#initialize)

Kind regards

    robert