Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Newbie questions

Reply
Thread Tools

Newbie questions

 
 
Barr, Keith
Guest
Posts: n/a
 
      08-25-2007
--Boundary_(ID_cjdMwiw/0WtJODjPmwiKBw)
Content-type: text/plain; charset=iso-8859-1
Content-transfer-encoding: 7BIT

Hi there,

I am new to using Ruby and I am writing my first real programs and I have something I was wonndering about:

I have a menu that I would like users to respond to simply by entering a single character. I have tried both STDIN.getc and gets, but both require a carriage return. Is there a command I haven't found that will actively read STDIN to process a single character as soon as it is entered?

Thanks in advance,
Keith

--Boundary_(ID_cjdMwiw/0WtJODjPmwiKBw)--

 
Reply With Quote
 
 
 
 
Dan Zwell
Guest
Posts: n/a
 
      08-25-2007
Barr, Keith wrote:
> Hi there,
>
> I am new to using Ruby and I am writing my first real programs and I have something I was wonndering about:
>
> I have a menu that I would like users to respond to simply by entering a single character. I have tried both STDIN.getc and gets, but both require a carriage return. Is there a command I haven't found that will actively read STDIN to process a single character as soon as it is entered?
>
> Thanks in advance,
> Keith


This is a common question. You need a library (gem) that provides this
function. I have heard that highline, ncurses, and termios have this. In
ncurses, it's called "getch", but I don't know about the others.

Dan

 
Reply With Quote
 
 
 
 
James Edward Gray II
Guest
Posts: n/a
 
      08-25-2007
On Aug 25, 2007, at 3:36 PM, Dan Zwell wrote:

> Barr, Keith wrote:
>> Hi there,
>> I am new to using Ruby and I am writing my first real programs
>> and I have something I was wonndering about:
>> I have a menu that I would like users to respond to simply by
>> entering a single character. I have tried both STDIN.getc and
>> gets, but both require a carriage return. Is there a command I
>> haven't found that will actively read STDIN to process a single
>> character as soon as it is entered?
>> Thanks in advance,
>> Keith

>
> This is a common question. You need a library (gem) that provides
> this function. I have heard that highline, ncurses, and termios
> have this. In ncurses, it's called "getch", but I don't know about
> the others.


Here's how you do it with HighLine:

http://blog.grayproductions.net/arti..._one_character

James Edward Gray II

 
Reply With Quote
 
William James
Guest
Posts: n/a
 
      08-25-2007
On Aug 25, 3:05 pm, "Barr, Keith" <(E-Mail Removed)> wrote:
> Hi there,
>
> I am new to using Ruby and I am writing my first real
> programs and I have something I was wonndering about:
>
> I have a menu that I would like users to respond to
> simply by entering a single character. I have tried
> both STDIN.getc and gets, but both require a carriage
> return. Is there a command I haven't found that will
> actively read STDIN to process a single character as
> soon as it is entered?


if RUBY_PLATFORM =~ /win32/
require 'Win32API'
Kbhit = Win32API.new("msvcrt", "_kbhit", [], 'I')
Getch = Win32API.new("msvcrt", "_getch", [], 'I')
def getkey
sleep 0.01
return nil if Kbhit.call.zero?
c = Getch.call
c = Getch.call + 256 if c.zero? || c == 0xE0
c
end
else
def getkey
select( [$stdin], nil, nil, 0.01 ) ? c = $stdin.getc : c = nil
end
end

5.times{
begin end until key = getkey
print key.chr
}

 
Reply With Quote
 
Bertram Scharpf
Guest
Posts: n/a
 
      08-26-2007
Hi,

Am Sonntag, 26. Aug 2007, 07:00:06 +0900 schrieb William James:
> On Aug 25, 3:05 pm, "Barr, Keith" <(E-Mail Removed)> wrote:
> > I have a menu that I would like users to respond to
> > simply by entering a single character.

>=20
> def getkey
> select( [$stdin], nil, nil, 0.01 ) ? c =3D $stdin.getc : c =3D nil
> end


Why `c=3D=C2=B4? Why twice?

It doesn't work here; it still waits for the enter key.

I doubt whether there is any other way than using termios.

Bertram


--=20
Bertram Scharpf
Stuttgart, Deutschland/Germany
http://www.bertram-scharpf.de

 
Reply With Quote
 
Wai Tsang
Guest
Posts: n/a
 
      08-26-2007
Bertram Scharpf wrote:
> Hi,
>
> Am Sonntag, 26. Aug 2007, 07:00:06 +0900 schrieb William James:
>> On Aug 25, 3:05 pm, "Barr, Keith" <(E-Mail Removed)> wrote:
>> > I have a menu that I would like users to respond to
>> > simply by entering a single character.

>>
>> def getkey
>> select( [$stdin], nil, nil, 0.01 ) ? c = $stdin.getc : c = nil
>> end

>
> Why `c=´? Why twice?
>
> It doesn't work here; it still waits for the enter key.
>
> I doubt whether there is any other way than using termios.
>
> Bertram


It means if select( [$stdin], nil, nil, 0.01 ) return true,
then c = $stdin.getc; otherwise c = nil.
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
William James
Guest
Posts: n/a
 
      08-26-2007
On Aug 25, 7:16 pm, Bertram Scharpf <(E-Mail Removed)> wrote:
> Hi,
>
> Am Sonntag, 26. Aug 2007, 07:00:06 +0900 schrieb William James:
>
> > On Aug 25, 3:05 pm, "Barr, Keith" <(E-Mail Removed)> wrote:
> > > I have a menu that I would like users to respond to
> > > simply by entering a single character.

>
> > def getkey
> > select( [$stdin], nil, nil, 0.01 ) ? c = $stdin.getc : c = nil
> > end

>
> Why `c=? Why twice?


Don't ask me; it's not my code.
>
> It doesn't work here; it still waits for the enter key.


It works here under windoze; I can't test it under unix.

>
> I doubt whether there is any other way than using termios.



 
Reply With Quote
 
Bertram Scharpf
Guest
Posts: n/a
 
      08-26-2007
Hi,

Am Sonntag, 26. Aug 2007, 15:15:04 +0900 schrieb William James:
> On Aug 25, 7:16 pm, Bertram Scharpf <(E-Mail Removed)> wrote:
> > Am Sonntag, 26. Aug 2007, 07:00:06 +0900 schrieb William James:
> > > def getkey
> > > select( [$stdin], nil, nil, 0.01 ) ? c = $stdin.getc : c = nil
> > > end

> >
> > It doesn't work here; it still waits for the enter key.

>
> It works here under windoze; I can't test it under unix.


That was what I meant: You did not test it on a POSIX
system.

You wrote:

if RUBY_PLATFORM =~ /win32/
[...]
else
def getkey
select( [$stdin], nil, nil, 0.01 ) ? c = $stdin.getc : c = nil
end
end

As long as there are no parsing errors this alway works
under Windows. I tested it under Linux and there, it doesn't
work.

Bertram

--
Bertram Scharpf
Stuttgart, Deutschland/Germany
http://www.bertram-scharpf.de

 
Reply With Quote
 
Bertram Scharpf
Guest
Posts: n/a
 
      08-26-2007
Hi,

Am Sonntag, 26. Aug 2007, 10:05:07 +0900 schrieb Wai Tsang:
> Bertram Scharpf wrote:
> > Am Sonntag, 26. Aug 2007, 07:00:06 +0900 schrieb William James:
> >> On Aug 25, 3:05 pm, "Barr, Keith" <(E-Mail Removed)> wrote:
> >>=20
> >> select( [$stdin], nil, nil, 0.01 ) ? c =3D $stdin.getc : c =3D nil

> > Why `c=3D=C2=B4? Why twice?

>=20
> It means if select( [$stdin], nil, nil, 0.01 ) return true,
> then c =3D $stdin.getc; otherwise c =3D nil.


The variable c will not be used and the assignment is
mentioned twice. Besides that it is questionable whether an
assignment in a ?: expression will parse how the author
intended.

That the function will return `true' is just a lie.

Bertram


--=20
Bertram Scharpf
Stuttgart, Deutschland/Germany
http://www.bertram-scharpf.de

 
Reply With Quote
 
John Joyce
Guest
Posts: n/a
 
      08-26-2007

On Aug 26, 2007, at 9:32 AM, Bertram Scharpf wrote:

> Hi,
>
> Am Sonntag, 26. Aug 2007, 10:05:07 +0900 schrieb Wai Tsang:
>> Bertram Scharpf wrote:
>>> Am Sonntag, 26. Aug 2007, 07:00:06 +0900 schrieb William James:
>>>> On Aug 25, 3:05 pm, "Barr, Keith" <(E-Mail Removed)> wrote:
>>>>
>>>> select( [$stdin], nil, nil, 0.01 ) ? c =3D $stdin.getc : c =3D =

nil
>>> Why `c=3D=B4? Why twice?

>>
>> It means if select( [$stdin], nil, nil, 0.01 ) return true,
>> then c =3D $stdin.getc; otherwise c =3D nil.

>
> The variable c will not be used and the assignment is
> mentioned twice. Besides that it is questionable whether an
> assignment in a ?: expression will parse how the author
> intended.
>
> That the function will return `true' is just a lie.
>
> Bertram

Bertram, no need for inflamatory statements. Calling something 'just =20
a lie' implies that the person is maliciously trying to spread false =20
information. It might be more appropriate to simply say that it is a =20
mistake and explain why.


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
newbie with newbie questions JohnE ASP .Net 3 08-17-2009 10:10 PM
Malloc and free questions - learner questions pkirk25 C Programming 50 10-04-2006 02:22 PM
Questions on Canon 300D and etc. questions regarding digital photography Progressiveabsolution Digital Photography 12 03-24-2005 05:18 PM
Newbie questions - Couple of VC++ questions regarding dlls and VB6 Ali Syed C Programming 3 10-13-2004 10:15 PM
Re: Questions....questions....questions Patrick Michael A+ Certification 0 06-16-2004 04:53 PM



Advertisments