класс Prism::InNode
Представляет использование ключевого слова «in» в операторе case.
case a; in b then c end
^^^^^^^^^^^ Атрибуты
attr_reader pattern: Node
attr_reader statements: StatementsNode?
Открытые методы класса
# File lib/prism/node.rb, line 8144 def initialize(pattern, statements, in_loc, then_loc, location) @pattern = pattern @statements = statements @in_loc = in_loc @then_loc = then_loc @location = location end
def initialize: (pattern: Node, statements: StatementsNode?, in_loc: Location, then_loc: Location?, location: Location) -> void
# File lib/prism/node.rb, line 8244 def self.type :in_node end
Аналогично type, этот метод возвращает символ, который можно использовать для разделения по типу узла, без необходимости выполнения длинной цепочки ===. Обратите внимание, что, как и type, он всё ещё будет медленнее, чем использование == для единственного класса, но должен быть быстрее в операторе case или сравнении массивов.
def self.type: () -> Symbol
Общедоступные методы экземпляра
# File lib/prism/node.rb, line 8153 def accept(visitor) visitor.visit_in_node(self) end
def accept: (visitor: Visitor) -> void
# File lib/prism/node.rb, line 8158 def child_nodes [pattern, statements] end
def child_nodes: () -> Array[nil | Node]
# File lib/prism/node.rb, line 8171 def comment_targets [pattern, *statements, in_loc, *then_loc] end
def comment_targets: () -> Array[Node | Location]
# File lib/prism/node.rb, line 8163 def compact_child_nodes compact = [] compact << pattern compact << statements if statements compact end
def compact_child_nodes: () -> Array
# File lib/prism/node.rb, line 8176
def copy(**params)
InNode.new(
params.fetch(:pattern) { pattern },
params.fetch(:statements) { statements },
params.fetch(:in_loc) { in_loc },
params.fetch(:then_loc) { then_loc },
params.fetch(:location) { location },
)
end def copy: (**params) -> InNode
# File lib/prism/node.rb, line 8190
def deconstruct_keys(keys)
{ pattern: pattern, statements: statements, in_loc: in_loc, then_loc: then_loc, location: location }
end def deconstruct_keys: (keys: Array) -> Hash[Symbol, nil | Node | Array | String | Token | Array | Location]
# File lib/prism/node.rb, line 8195 def in in_loc.slice end
def in: () -> String
# File lib/prism/node.rb, line 8205
def inspect(inspector = NodeInspector.new)
inspector << inspector.header(self)
inspector << "├── pattern:\n"
inspector << inspector.child_node(pattern, "│ ")
if (statements = self.statements).nil?
inspector << "├── statements: ∅\n"
else
inspector << "├── statements:\n"
inspector << statements.inspect(inspector.child_inspector("│ ")).delete_prefix(inspector.prefix)
end
inspector << "├── in_loc: #{inspector.location(in_loc)}\n"
inspector << "└── then_loc: #{inspector.location(then_loc)}\n"
inspector.to_str
end def inspect(inspector: NodeInspector) -> String
# File lib/prism/node.rb, line 8200 def then then_loc&.slice end
def then: () -> String?
# File lib/prism/node.rb, line 8234 def type :in_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.