Cheered to soon...... enumerable woos

hi,

what i'd like to do is let my each method yield aal instance variables include enumerable to have the ability to test if self.include? yields true or not..

My instance_variables however are mostly string objects with one Array. the array holds one or more strings

I cannot get .include? to work propperly. it wil return false even though the array members hold the substring.

anyone?

say each is
def each
   yield "#{var1}"
   yield "#{var2}"
end
where var2 is an Array

def search str
   self.inlude? str
end

the search method always returns false even if var2 holds the str.
str is not always the whole string member of the array could be just a part of it. say one word from a multi word string..

Eelco

···

from my class

Firstly, post a complete small program which demonstrates your problem -
something we can actually run and see exactly the same as you do. And
copy-paste it exactly (or post a URL to pastebin or similar)

And secondly: include? will test each member you yield individually. If
the member you yield is an array, then it will only match another
identical array.

···

--
Posted via http://www.ruby-forum.com/.

Aha! There's your problem. By default, the array is just going to
get checked to see if it, itself, equals the string you're looking
for. You have to override #search to also look inside the array.

-Dave

···

On Tue, Feb 21, 2012 at 12:52, Catsquotl <Catsquotl@gmail.com> wrote:

My instance_variables however are mostly string objects with one Array. the
array holds one or more strings

--
Dave Aronson: Available Cleared Ruby on Rails Freelancer
(NoVa/DC/Remote) -- see www.DaveAronson.com, and blogs at
www.Codosaur.us, www.Dare2XL.com, www.RecruitingRants.com

class Acupunt
   include Enumerable

   attr_reader :afk, :name,:chname, :locatie, :aard, :actie

   def initialize(arr)
     set_instance_variables arr
   end

   def set_instance_variables arr
     @afk=arr[0]
     @name=arr[1]
     @chname=arr[2]
     @locatie=arr[3]
     @aard=arr[4]
     @actie=arr[5..-1]
   end

   def each
      yield "#{@afk}"
      yield "#{@name}"
      yield "#{@chname}"
      yield "#{@locatie}"
      yield "#{@aard}"
      yield "#{@actie}"
   end

   def search str
     self.include? str
   end

end

ac = Acupunt.new(["bl", "witte vloed", "tingwell", "6cun vanaf", "Luo","klaart hitte","2de","en een 3de"])
ac.search "bl" #This yields true
ac.search "hitte" #this yields false, but I want it to be true

Op 21-2-2012 19:24, Brian Candler schreef:

···

Firstly, post a complete small program which demonstrates your problem -
something we can actually run and see exactly the same as you do. And
copy-paste it exactly (or post a URL to pastebin or similar)

And secondly: include? will test each member you yield individually. If
the member you yield is an array, then it will only match another
identical array.

Maybe "self.include?(str) || actie.include?(str)"?

-Dave

···

On Tue, Feb 21, 2012 at 14:03, Catsquotl <Catsquotl@gmail.com> wrote:

def search str
self.include? str

--
Dave Aronson: Available Cleared Ruby on Rails Freelancer
(NoVa/DC/Remote) -- see www.DaveAronson.com, and blogs at
www.Codosaur.us, www.Dare2XL.com, www.RecruitingRants.com

def each(&block)
  [@afk, @name, @chname, @locatie, @aard, @actie].flatten.each(&block)
end

···

On Feb 21, 2012, at 11:03 , Catsquotl wrote:

def each
    yield "#{@afk}"
    yield "#{@name}"
    yield "#{@chname}"
    yield "#{@locatie}"
    yield "#{@aard}"
    yield "#{@actie}"
end

Hi,

I can't seem to get my head around what is happening in the code-snippet below.
What i think is happening is this.

each is called with a block.
this block iterates over each element of the flattened array.

But then?
what does the last call to each(&block) on line 2 do?

when called with a block
say self.each{|n| puts n}
nothing seems to happen and the flattened array is returned.

Can anyone say what's going on?
I've read up on blocks, procs and lambda's for the last few hours, but I can't seem to get to grips with the logic.

call me stupid
Eelco

···

def each(&block)
   [@afk, @name, @chname, @locatie, @aard, @actie].flatten.each(&block)
end

What i think is happening is this.

each is called with a block.
this block iterates over each element of the flattened array.

The block does nothing by itself. The block is an anonymous callback function.

But then?
what does the last call to each(&block) on line 2 do?

when called with a block
say self.each{|n| puts n}
nothing seems to happen and the flattened array is returned.

Actually "self" should be returned conventionally. But that is just a
detail which has nothing to do with iteration.

I can't really believe that nothing happens. Let's just try this in IRB:

irb(main):001:0> class X
irb(main):002:1> attr_accessor :a, :b, :c
irb(main):003:1> def each(&block)
irb(main):004:2> [a,b,c].flatten.each(&block)
irb(main):005:2> end
irb(main):006:1> end
=> nil
irb(main):007:0> x = X.new
=> #<X:0x202d2bc8>
irb(main):008:0> x.a = 1
=> 1
irb(main):009:0> x.b = 2
=> 2
irb(main):010:0> x.c = 3
=> 3
irb(main):011:0> x.each {|n| puts n}
1
2
3
=> [1, 2, 3]

Now please show your code which does not do anything.

Can anyone say what's going on?
I've read up on blocks, procs and lambda's for the last few hours, but I
can't seem to get to grips with the logic.

The block is simply forwarded to the second call of #each. Before
that #flatten just ensures that nested Arrays are expanded and every
element of them is visited individually.

def each(&block)
[@afk, @name, @chname, @locatie, @aard, @actie].flatten.each(&block)
end

Btw. that method should conventionally return "self" at the end.

Kind regards

robert

···

On Thu, Feb 23, 2012 at 9:58 AM, Catsquotl <Catsquotl@gmail.com> wrote:

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

Thank you,

After reading your post i took another look at what i was trying to do.
As i am just playing with different ide's, different irb setups and Rspec testing. I missed what exactly was happening.
I had hoped to be able to use include? to return true even on a substring. It does not do so in Arrays.
Also i wanted my search method to return either true or false, but with the each(&block) coded as it is
the search method will return the entire array defined in each
  rendering my result.should == true or false useless...

Anyway I settled on the following.

   def each(&block)
     [@afk, @name, @chname, @locatie, @aard, @actie].flatten.each(&block)
   end

   def search str
      self.each do|n|
        if n.match(str) then
          return true
        end
      end
   end

I do have the notion that search could be changed to return true or false, but this way i can test whether it is true or not_true.
And the class does what it needs to do...

Eelco

···

Btw. that method should conventionally return "self" at the end.

Kind regards

robert

Thank you,

After reading your post i took another look at what i was trying to do.
As i am just playing with different ide's, different irb setups and Rspec
testing. I missed what exactly was happening.

Please post a http://sscce.org/ otherwise people have a hard time
providing help. We can't read minds.

I had hoped to be able to use include? to return true even on a substring.
It does not do so in Arrays.
Also i wanted my search method to return either true or false, but with the
each(&block) coded as it is
the search method will return the entire array defined in each
rendering my result.should == true or false useless...

Anyway I settled on the following.

def each(&block)
[@afk, @name, @chname, @locatie, @aard, @actie].flatten.each(&block)
end

There is still self missing at the end of this method.

def search str
self.each do|n|
if n.match(str) then
return true
end
end
end

There is Enumerable#any?

def search str
  any? {|n| n.match(str)}
end

I do have the notion that search could be changed to return true or false,
but this way i can test whether it is true or not_true.
And the class does what it needs to do...

Do not rely on "true" and "false" used as boolean values. Rather
directly evaluate the value in a boolean context.

Cheers

robert

···

On Fri, Feb 24, 2012 at 1:41 PM, Catsquotl <Catsquotl@gmail.com> wrote:

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/