【问题标题】:STDIN.ready? (crystal-lang)标准输入准备好了吗? (水晶朗)
【发布时间】:2019-05-01 06:34:21
【问题描述】:

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

在搜索时我找到了STDIN.raw &.read_char。 根据文档,当没有什么可读的时候,这应该返回一个 nil 。但是,我没有得到零。它似乎在等待下一个键。 ruby 代码有一个$stdin.getc

只要 STDIN 准备好并积累关键代码,我的逻辑基本上就一直在读取它。 ready? 返回 false 的那一刻,密钥被评估。

现在的逻辑是:

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

早期的红宝石:

if c == '\e'
  loop
    if STDIN.ready?
      k = STDIN.getc
      accumulate in string
    else
      evaluation string and return code
    end
   end
end

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

【问题讨论】:

  • 如果您知道击键的最大长度,那么在 2048 示例中使用的技术可能就足够了:github.com/crystal-lang/crystal/blob/master/samples/2048.cr#L39STDIN.ready? 基本上检查 IO 上是否有待处理的数据,因此读取所有待处理的数据一次数据而不阻塞更多数据应该有类似的效果。
  • 今晚我会试试这个。如果这可行,则意味着read(bytes) 是非阻塞的,而read_char 是阻塞的。是的,对于移位的功能键,最大字符数可能是四个,尽管在大多数情况下更少。
  • @JonneHaß 谢谢,您对 2048.cr 的建议效果很好。

标签: crystal-lang


【解决方案1】:

这不是答案,如果这里没有正确答案,这只是一种解决方法。

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

【讨论】:

  • 非常感谢您的帮助。您从 2048.cr 建议的代码适用于我的情况。我还没有检查 shift-Fn 键,并且花了很多时间来清除所有编译错误。但它有效,将更新我上面的问题。如果您将该评论作为回复发布,我会将其标记为正确答案。
  • 这不是答案,我不知道如何做对。只是对您将代码移植到 Crystal 的一点帮助。刚开始学水晶我也不容易)
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多