# Noob question: object to string

**URL:** <https://www.ruby-forum.com/t/noob-question-object-to-string/156942>\
**Category:** Ruby\
**Created:** [January 5, 2009, 5:02pm UTC](https://www.ruby-forum.com/t/noob-question-object-to-string/156942 "2009-01-05T17:02:13Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![dginther](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/3e96dc/32.png) [@dginther](https://www.ruby-forum.com/u/dginther)\
**Post date:** [January 5, 2009, 5:02pm UTC](https://www.ruby-forum.com/t/noob-question-object-to-string/156942/1 "2009-01-05T17:02:13Z")

</div>

So I’m able to exercise creating my own class and returning an object  
from that class. I’m having trouble treating the return as an integer  
(for the purpose of a \< or \> compare)… Yet another noob syntax  
question.

compare.rb:  
myinitialdbcount = Dbutil.new(mydb, dbuser, dbpw, counttable,  
leadtype)  
puts “Initial Count:”  
initialcount = myinitialdbcount.count\_table{ |data| p data }

This returns:  
Initial Count:  
213912

If I try to simply print (put) it:  
puts myinitialdbcount.count\_table{ |data| p data }

This returns:  
nill

I think I need to “to\_int” this object or get it into a state where I  
can assign it to a local variable… There is something I dont  
understand here.

dbutil.rb:  
def count\_table  
dbh= DBI.connect(@mydb, @dbuser, @dbpw)  
sth = dbh.execute(“SELECT count(\*) FROM #@table where type\_code =  
#@type\_code”)  
row = sth.fetch  
yield row[0]  
sth.finish  
dbh.disconnect  
end

---

<div class="post-metadata">

**Author:** ![dginther](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/3e96dc/32.png) [@dginther](https://www.ruby-forum.com/u/dginther)\
**Post date:** [January 5, 2009, 5:29pm UTC](https://www.ruby-forum.com/t/noob-question-object-to-string/156942/2 "2009-01-05T17:29:51Z")

</div>

On Mon, Jan 5, 2009 at 10:02 AM, Darin Ginther  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> initialcount = myinitialdbcount.count\_table{ |data| p data }  
> This returns:  
> def count\_table  
> dbh= DBI.connect(@mydb, @dbuser, @dbpw)  
> sth = dbh.execute(“SELECT count(\*) FROM #@table where type\_code =  
> #@type\_code”)  
> row = sth.fetch  
> yield row[0]  
> sth.finish  
> dbh.disconnect  
> end

The count\_table method will return whatever the last statement in the  
method returns, which, in this case is dbh.disconnect. My guess is  
that disconnect always returns nil unless you are already  
disconnected. So, in essence, you are saying, puts nil. It should  
still print the data to your output stream (most likely standard  
output), though, because that’s what your block is doing with the  
yielded value row[0].

Todd

---

<div class="post-metadata">

**Author:** ![dginther](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/3e96dc/32.png) [@dginther](https://www.ruby-forum.com/u/dginther)\
**Post date:** [January 5, 2009, 5:34pm UTC](https://www.ruby-forum.com/t/noob-question-object-to-string/156942/3 "2009-01-05T17:34:33Z")

</div>

I understand what you are saying… We used “yield” to return from the  
method, otherwise I was essentially returning the dbh.disconnect.

Calling the method is writing to standard out… My question is, how do  
I get that standard output into a local variable or some other usable  
form? I need to assign it to a variable and then compare it to another  
variable later…

---

<div class="post-metadata">

**Author:** ![dginther](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/3e96dc/32.png) [@dginther](https://www.ruby-forum.com/u/dginther)\
**Post date:** [January 5, 2009, 6:12pm UTC](https://www.ruby-forum.com/t/noob-question-object-to-string/156942/4 "2009-01-05T18:12:12Z")

</div>

Got it. Yield goes straight to stdio. Instead, return the first value  
of that array at the end of the method:  
def count\_table  
dbh= DBI.connect(@mydb, @dbuser, @dbpw)  
sth = dbh.execute(“SELECT count(\*) FROM #@table where  
lead\_type\_code = #@lead\_type\_code”)  
row = sth.fetch  
#yield row[0] This will write to STIO immediately  
sth.finish  
dbh.disconnect  
row[0]  
end  
end

---

<div class="post-metadata">

**Author:** ![dginther](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/3e96dc/32.png) [@dginther](https://www.ruby-forum.com/u/dginther)\
**Post date:** [January 5, 2009, 6:17pm UTC](https://www.ruby-forum.com/t/noob-question-object-to-string/156942/5 "2009-01-05T18:17:24Z")

</div>

On Mon, Jan 5, 2009 at 11:02 AM, Darin Ginther  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> initialcount = myinitialdbcount.count\_table{ |data| p data }  
> A block returns the value of the last expression inside it. The last  
> expression here is “p data”, so what is getting returned is the value  
> returned by the “p” method. Try this:

initialcount = myinitialdbcount.count\_table{ |data| data }

# Now initialcount contains the value in data

p initialcount

# or

puts initialcount.to\_s

---

<div class="post-metadata">

**Author:** ![dginther](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/3e96dc/32.png) [@dginther](https://www.ruby-forum.com/u/dginther)\
**Post date:** [January 5, 2009, 9:13pm UTC](https://www.ruby-forum.com/t/noob-question-object-to-string/156942/6 "2009-01-05T21:13:04Z")

</div>

Was working, but I’ll take the context correction.

---

<div class="post-metadata">

**Author:** ![dginther](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/3e96dc/32.png) [@dginther](https://www.ruby-forum.com/u/dginther)\
**Post date:** [January 5, 2009, 9:07pm UTC](https://www.ruby-forum.com/t/noob-question-object-to-string/156942/7 "2009-01-05T21:07:26Z")

</div>

On Mon, Jan 5, 2009 at 11:02 AM, Darin Ginther \<  
removed\_email\_address@domain.invalid\> wrote:

> initialcount = myinitialdbcount.count\_table{ |data| p data }
> 
> ```
> yield row[0]
> sth.finish
> 
> ```
> 
> dbh.disconnect  
> end

I don’t know anything about DBI, but what do you get as output from the  
“p  
data” statement?

Also, I noticed a problem with your dbh.execute statement: “SELECT …  
#@table …” probably isn’t doing what you were hoping it was doing.  
You  
most likely meant “SELECT … #{@table} …”, also with “#{@type\_code”.

hth  
–wpd

---

<div class="post-metadata">

**Author:** ![dginther](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/3e96dc/32.png) [@dginther](https://www.ruby-forum.com/u/dginther)\
**Post date:** [January 7, 2009, 8:18am UTC](https://www.ruby-forum.com/t/noob-question-object-to-string/156942/8 "2009-01-07T08:18:31Z")

</div>

Patrick D. wrote:

> > compare.rb:  
> > puts myinitialdbcount.count\_table{ |data| p data }  
> > dbh= DBI.connect(@mydb, @dbuser, @dbpw)  
> > data" statement?
> 
> Also, I noticed a problem with your dbh.execute statement: “SELECT …  
> #@table …” probably isn’t doing what you were hoping it was doing. You  
> most likely meant “SELECT … #{@table} …”, also with “#{@type\_code”.
> 
> hth  
> –wpd

The OP’s approach works as well. It’s a shortcut which can be used with  
instance variables and global variables:

irb(main):001:0\> @a = “hello”  
=\> “hello”  
irb(main):002:0\> “#@a there”  
=\> “hello there”  
irb(main):003:0\> $a = “hi”  
=\> “hi”  
irb(main):004:0\> “#$a back”  
=\> “hi back”

-Justin
