A class is a collection of related methods that operate on the state of an object.
An object’s state is held by its instance variables: variables whose names begin with @ and whose values are specific
to that particular object.
This example class demonstrates how to write iterator methods and define operators.
lpp@nereida:~/src/rubytesting/TheRubyProgrammingLanguage$ cat -n Sequence.rb
1 # The Ruby programming Language Flanagan & Matsumoto
2 # page 8
3 class Sequence
4 include Enumerable
5 def initialize(from, to, by)
6 @from, @to, @by = from, to, by
7 end
8
9 def each
10 x = @from
11 while x <= @to
12 yield x
13 x +=@by
14 end
15 end
16
17 def length
18 return 0 if @from > @to
19 Integer((@to-@from)/@by)+1
20 end
21
22 alias size length
23
24 # override the array-access operator to give random access to the sequence
25
26 def [](index)
27 return nil if index < 0
28 v = @from+index*@by
29 return v if v <= @to
30 return nil
31 end
32
33 def *(factor)
34 Sequence.new(@from*factor, @to*factor, @by*factor)
35 end
36
37 def +(offset)
38 Sequence.new(@from+offset, @to+offset, @by)
39 end
40 end
Here is some code that uses this Sequence class:
lpp@nereida:~/src/rubytesting/TheRubyProgrammingLanguage$ cat -n useSequence.rb
1 #!/usr/bin/env ruby
2 require "Sequence.rb"
3
4 a = Sequence.new(1,10,2)
5 a.each { |x| print x,"\n" } # 1 3 5 7 9
6
7 puts "Length = #{a.length}" # 5
8 puts "Size = #{a.size}" # 5
9
10 (0..(a.size-1)).each { |i| # Podemos indexar
11 puts "a[#{i}] = '#{a[i]}'" # un objeto Sequence
12 }
13
14 puts ""
15
16 b = a * 2 # b is a new Sequence object
17 b.each { |x| print x,"\n" } # 2 6 10 14 18
18
19 puts ""
20
21 b = a + 2 # b is a new Sequence object
22 b.each { |x| print x,"\n" } # 3 5 7 9 11
lpp@nereida:~/src/rubytesting/TheRubyProgrammingLanguage$ ./useSequence.rb 1 3 5 7 9 Length = 5 Size = 5 a[0] = '1' a[1] = '3' a[2] = '5' a[3] = '7' a[4] = '9' 2 6 10 14 18 3 5 7 9 11
Casiano Rodriguez León 2015-01-07