require "compiler/crystal/syntax"
s = "a = 5; puts a + 3"
nodes = Crystal::Parser.parse(s)
puts nodes.class # => Crystal::Expressions
puts nodes.is_a? Crystal::Expressions # => true
puts nodes.is_a? Crystal::Nop # => false
puts nodes.expressions
Итак, я бы предположил, что последнее выражение даст массив (или узел ArrayLiteral). Тем не менее, я получаю
undefined method 'expressions' for Crystal::Nop (compile-time type is Crystal::ASTNode+)
Что не имеет смысла. .class
и .is_a?
- проверки во время выполнения, поэтому nodes
, который имеет тип времени компиляции ASTNode
, должен быть Crystal::Expressions
, а не Crystal::Nop
.
Поведение аналогично в версиях Crystal 0.25.0, 0.25.1, 0.26.0, 0.26.1 и в настоящее время в основной ветке git repo.