首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STDIN.ready?(crystal-lang)

STDIN.ready?(crystal-lang)
EN

Stack Overflow用户
提问于 2019-05-01 14:34:21
回答 1查看 365关注 0票数 1

我当前的ruby命令行应用程序使用STDIN.ready?。这允许我捕获复杂的键,如元键,功能键,移位功能键等。我在Crystal中找不到任何类似的东西。

在搜索过程中,我找到了STDIN.raw &.read_char。根据文档,当没有任何东西可读时,这应该返回一个nil。然而,我没有得到零。它似乎在等待下一个密钥。拼音代码有一个$stdin.getc

只要STDIN准备就绪,我的逻辑就会一直读取它,并累积关键代码。当ready?返回false时,就会计算该键。

现在的逻辑是:

代码语言:javascript
复制
c = STDIN.raw &.read_char
if c == '\e' # escape char
  loop do
   k = STDIN.raw &.read_char
   if k
     # accumulate k into a string
   else
     # evaluate string and return
   end
  end #loop
end
# rest of code if not escape.

目前else条件没有执行,所以我被困在if部件中。我不知道什么时候该停止读钥匙。

以前,在ruby中,我在if STDIN.ready?中有第二个getc

早些时候在ruby中:

代码语言:javascript
复制
if c == '\e'
  loop
    if STDIN.ready?
      k = STDIN.getc
      accumulate in string
    else
      evaluation string and return code
    end
   end
end

编辑:对我来说,正确的答案在于下面评论中建议的2048.cr的链接。

EN

回答 1

Stack Overflow用户

发布于 2019-05-02 19:27:22

这不是一个答案,如果这里没有正确的答案,这只是一个变通方法。

代码语言:javascript
复制
def handle_second_key(buffer)
  loop do
    input = STDIN.raw &.read_char
    buffer << input if input
    if buffer.size == 2
      if buffer[0] == '\e' && buffer[1] == 'q'
        puts "Right combination #{buffer[0].dump} + #{buffer[1].dump}"
        exit
      else
        puts "Wrong combination: #{buffer[0].dump} + #{buffer[1].dump}"
        break
      end
    end
  end
end

buffer = [] of Char

loop do
  input = STDIN.raw &.read_char
  buffer << input if input
  if buffer[0] == '\e'
    handle_second_key(buffer)
    buffer.clear
  else
    buffer.clear if buffer.size > 0
  end
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55932464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档