Undefined method '<' for nil:NilClasse

This is the code:
class StringScanner
@str = “”
@kounter = 0
def initialize(str)
@str = str
end
def scan(arg)
res = @str.scan(arg)
return nil unless @kounter<res.length
@[email protected]+1
res[@kounter-1]
end
end

str = “Watch how I soar!”
ss = StringScanner.new(str)
loop do
word = ss.scan(/\w+/) # Grab a word at a time
break if word.nil?
puts word
sep = ss.scan(/\W+/) # Grab next non-word piece
break if sep.nil?
end

And this is the result:
C:/Documents and Settings/Roby/Desktop/Apps/Ruby/prova2.rb:9:in scan': undefined method<’ for nil:NilClass (NoMethodError)
from C:/Documents and
Settings/Roby/Desktop/Apps/Ruby/prova2.rb:18
from C:/Documents and
Settings/Roby/Desktop/Apps/Ruby/prova2.rb:17:in `loop’
from C:/Documents and
Settings/Roby/Desktop/Apps/Ruby/prova2.rb:17

Help.

You have to initialize instance members inside the initialize
function, or another function that’s called after instantiation.
That’s why @kounter is nil. Try putting @kounter=0 inside #initialize

HTH
MT

On Wed, Mar 19, 2008 at 2:38 PM, Roberto C.

Roberto C. wrote:

@[email protected]+1

sep = ss.scan(/\W+/) # Grab next non-word piece
from C:/Documents and
Settings/Roby/Desktop/Apps/Ruby/prova2.rb:17

Help.

I’m not sure I understand Ruby at all…, but @kounter.class is
‘NilClass’.

Graham

Roberto C. wrote:

@[email protected]+1

sep = ss.scan(/\W+/) # Grab next non-word piece
from C:/Documents and
Settings/Roby/Desktop/Apps/Ruby/prova2.rb:17

Help.

The probblem is in the initializing. If you explicitly initialize
@kounter in the initialize method then it knows it’s a Fixnum.

Graham

On 3/19/08, Slark [email protected] wrote:

The probblem is in the initializing. If you explicitly initialize
@kounter in the initialize method then it knows it’s a Fixnum.

Variables aren’t typed in Ruby, nor are they declared. A variable
isn’t a particular class, it refers to an object, and the reference
can change over the life of the program.

@a = 1 #@a is now a fix num
@a = @a * 1.2 # And now it’s a float
@a = @a.to_s # And now it’s a String


Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

On 3/19/08, Roberto C. [email protected] wrote:

This is the code:
class StringScanner
@str = “”
@kounter = 0

Since the previous two lines are inside a class context rather than
inside an instance method, they define two class instance variables,
i.e. they are instance variables of the class object named
StringScanner.

These two variables are never actually used in the rest of the code,
much as it might seem to an untrained eye.

def initialize(str)
@str = str

This creates an instance variable for the INSTANCE of StringScanner
being initialized, this is an entirely different variable than the
@str we saw before.

end
def scan(arg)
res = @str.scan(arg)
return nil unless @kounter<res.length

Again @kounter is an instance variable associated with a particular
StringScanner object, it is NOT the previously seen @kounter.

puts word
sep = ss.scan(/\W+/) # Grab next non-word piece
break if sep.nil?
end

Now even if you straighten out the two variables, you are going around
Robin Hood’s barn to accomplish what can be easily done with:

“Watch how I soar!”.scan(/\w+/).each {|word| puts word}

or perhaps

puts “Watch how I soar!”.scan(/\w+/).join("\n")


Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

Roberto C. wrote:

@[email protected]+1

sep = ss.scan(/\W+/) # Grab next non-word piece
from C:/Documents and
Settings/Roby/Desktop/Apps/Ruby/prova2.rb:17

Help.

A simple way to understand how scoping (and naming convention) is
working in ruby is to try the following 3 examples and note their
output/errors:

1…
class C
str = “Hello”
def look
puts str.class
end
end
c = C.new
c.look

2…
class C
@str = “Hello”
def look
puts @str.class
end
end
c = C.new
c.look

3…
class C
@@str = “Hello”
def look
puts @@str.class
end
end
c = C.new
c.look

Graham

Oki guys. I understand.
Thank you!

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs