Array.include? strangeness


#1

Array.include? doesn’t seem to be telling me the truth.

Obviously this is ME getting it wrong, but could somebody explain what
is happening please.

  1. First I set up ab array of common words

def initialize
@common_words = ["&", “and”, “or”, “ltd”, “ltd.”, “limited”]
end

  1. Here I check to see if the variable words contains any uncommon
    words, and return them in a new array

def remove_common_words words
ok_words = Array.new
words.each(" “) do
|word|
logger.debug “checking if word " + word + " is common”
if !@common_words.include?(word)
logger.debug word + " is not common”
ok_words << word
logger.debug "ok_words: ".concat ok_words.to_s
end
end

return ok_words

end

  1. And this is the simple test…

def test_remove_common_words
e = Entity.new
x = e.remove_common_words “limited Martin & Steve’s Company limited”

puts x

end

The output from the puts is: Uncommon words returned:limited Martin &
Steve’s Company


#2

Hi,
See comment below
Martin Smith wrote:

Array.include? doesn’t seem to be telling me the truth.

Obviously this is ME getting it wrong, but could somebody explain what
is happening please.

  1. First I set up ab array of common words

def initialize
@common_words = ["&", “and”, “or”, “ltd”, “ltd.”, “limited”]
end

  1. Here I check to see if the variable words contains any uncommon
    words, and return them in a new array

def remove_common_words words
ok_words = Array.new
words.each(" ") do
^
|-- this operation leaves a space at the end of each word.

  |word|
  logger.debug "checking if word " + word + " is common"
  if !@common_words.include?(word)
           ^
           |-- replace with '!@common_words.include?(word.strip)' 

and it should work fine

    logger.debug word + " is not common"
    ok_words << word
    logger.debug "ok_words: ".concat ok_words.to_s
  end
end

return ok_words

end

  1. And this is the simple test…

def test_remove_common_words
e = Entity.new
x = e.remove_common_words “limited Martin & Steve’s Company limited”

puts x

end

The output from the puts is: Uncommon words returned:limited Martin &
Steve’s Company

good luck

Bill Stevens


#3

Thanks William - that worked great.


#4

Try this instead:

def remove_common_words(words)
words.split(" ") - @common_words
end


#5

Forgot to say that the problem is that String#each doesn’t do what you
want.

irb> “foo bar”.each(" ") { |x| p x }
"foo "
“bar”

(Note the space in "foo ".)