【发布时间】: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#L39
STDIN.ready?基本上检查 IO 上是否有待处理的数据,因此读取所有待处理的数据一次数据而不阻塞更多数据应该有类似的效果。 -
今晚我会试试这个。如果这可行,则意味着
read(bytes)是非阻塞的,而read_char是阻塞的。是的,对于移位的功能键,最大字符数可能是四个,尽管在大多数情况下更少。 -
@JonneHaß 谢谢,您对 2048.cr 的建议效果很好。
标签: crystal-lang