класс Prism::ImplicitNode
Представляет узел, который неявно добавляется в дерево, но не соответствует напрямую узлу в исходном коде.
{ foo: }
^^^^
{ Foo: }
^^^^ Атрибуты
attr_reader value: Node
Публичные методы класса
# File lib/prism/node.rb, line 8032 def self.type :implicit_node end
Аналогично type, этот метод возвращает символ, который можно использовать для разделения по типу узла, не прибегая к длинной цепочке ===. Обратите внимание, что, как и type, он по-прежнему будет медленнее, чем использование == для одного класса, но должен быть быстрее в операторе case или сравнении массивов.
def self.type: () -> Symbol
Публичные методы экземпляра
# File lib/prism/node.rb, line 7965 def accept(visitor) visitor.visit_implicit_node(self) end
def accept: (visitor: Visitor) -> void
# File lib/prism/node.rb, line 7970 def child_nodes [value] end
def child_nodes: () -> Array[nil | Node]
# File lib/prism/node.rb, line 7980 def comment_targets [value] end
def comment_targets: () -> Array[Node | Location]
# File lib/prism/node.rb, line 7975 def compact_child_nodes [value] end
def compact_child_nodes: () -> Массив
# File lib/prism/node.rb, line 7985
def copy(**params)
ImplicitNode.new(
params.fetch(:value) { value },
params.fetch(:location) { location },
)
end def copy: (**params) -> ImplicitNode
# File lib/prism/node.rb, line 7996
def deconstruct_keys(keys)
{ value: value, location: location }
end def deconstruct_keys: (keys: Массив) -> Словарь[Символ, nil | Node | Массив | String | Token | Массив | Location]
# File lib/prism/node.rb, line 8001 def inspect(inspector = NodeInspector.new) inspector << inspector.header(self) inspector << "└── value:\n" inspector << inspector.child_node(value, " ") inspector.to_str end
def inspect(inspector: NodeInspector) -> String
# File lib/prism/node.rb, line 8022 def type :implicit_node end
Иногда вам нужно проверить экземпляр узла на соответствие списку классов, чтобы определить, какое поведение выполнить. Обычно это делается с помощью вызова `[cls1, cls2].include?(node.class)` или помещения узла в оператор case и выполнения `case node; when cls1; when cls2; end`. Оба эти подхода относительно медленные из-за постоянных поисков, вызовов методов и/или выделения памяти массива.
Вместо этого вы можете вызвать type, который вернёт вам символ, который можно использовать для сравнения. Это быстрее, чем другие подходы, потому что используется одно сравнение целых чисел, а также потому, что если вы используете CRuby, вы можете воспользоваться тем фактом, что операторы case со всеми символами ключей будут использовать таблицу переходов.
def type: () -> Symbol
Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.