[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Newbie questions

Barr, Keith

8/25/2007 8:06:00 PM

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
9 Answers

Dan Zwell

8/25/2007 8:37:00 PM

0

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

James Gray

8/25/2007 8:42:00 PM

0

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/articles/i_just_want_one...

James Edward Gray II

William James

8/25/2007 9:55:00 PM

0

On Aug 25, 3:05 pm, "Barr, Keith" <keith.b...@lmco.com> 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
}

Bertram Scharpf

8/26/2007 12:17:00 AM

0

Hi,

Am Sonntag, 26. Aug 2007, 07:00:06 +0900 schrieb William James:
> On Aug 25, 3:05 pm, "Barr, Keith" <keith.b...@lmco.com> 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


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

Wai Tsang

8/26/2007 1:05:00 AM

0

Bertram Scharpf wrote:
> Hi,
>
> Am Sonntag, 26. Aug 2007, 07:00:06 +0900 schrieb William James:
>> On Aug 25, 3:05 pm, "Barr, Keith" <keith.b...@lmco.com> 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-....

William James

8/26/2007 6:13:00 AM

0

On Aug 25, 7:16 pm, Bertram Scharpf <li...@bertram-scharpf.de> wrote:
> Hi,
>
> Am Sonntag, 26. Aug 2007, 07:00:06 +0900 schrieb William James:
>
> > On Aug 25, 3:05 pm, "Barr, Keith" <keith.b...@lmco.com> 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.


Bertram Scharpf

8/26/2007 1:36:00 PM

0

Hi,

Am Sonntag, 26. Aug 2007, 15:15:04 +0900 schrieb William James:
> On Aug 25, 7:16 pm, Bertram Scharpf <li...@bertram-scharpf.de> 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-...

Bertram Scharpf

8/26/2007 2:33:00 PM

0

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" <keith.b...@lmco.com> wrote:
> >>
> >> select( [$stdin], nil, nil, 0.01 ) ? c = $stdin.getc : c = nil
> > Why `c=´? Why twice?
>
> It means if select( [$stdin], nil, nil, 0.01 ) return true,
> then c = $stdin.getc; otherwise c = 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 Scharpf
Stuttgart, Deutschland/Germany
http://www.bertram-...

John Joyce

8/26/2007 5:26:00 PM

0


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" <keith.b...@lmco.com> wrote:
>>>>
>>>> select( [$stdin], nil, nil, 0.01 ) ? c = $stdin.getc : c = nil
>>> Why `c=´? Why twice?
>>
>> It means if select( [$stdin], nil, nil, 0.01 ) return true,
>> then c = $stdin.getc; otherwise c = 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
a lie' implies that the person is maliciously trying to spread false
information. It might be more appropriate to simply say that it is a
mistake and explain why.