Spec-Zone.ru › Ruby 3.3

класс Prism::InNode

Родитель:
Prism::Node

Представляет использование ключевого слова «in» в операторе case.

case a; in b then c end
        ^^^^^^^^^^^

Атрибуты

in_loc[R]

attr_reader in_loc: Location

pattern[R]

attr_reader pattern: Node

statements[R]

attr_reader statements: StatementsNode?

then_loc[R]

attr_reader then_loc: Location?

Открытые методы класса

new(pattern, statements, in_loc, then_loc, location) Показать исходный код
# 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

type() Показать исходный код
# File lib/prism/node.rb, line 8244
def self.type
  :in_node
end

Аналогично type, этот метод возвращает символ, который можно использовать для разделения по типу узла, без необходимости выполнения длинной цепочки ===. Обратите внимание, что, как и type, он всё ещё будет медленнее, чем использование == для единственного класса, но должен быть быстрее в операторе case или сравнении массивов.

def self.type: () -> Symbol

Общедоступные методы экземпляра

accept(visitor) Показать исходный код
# File lib/prism/node.rb, line 8153
def accept(visitor)
  visitor.visit_in_node(self)
end

def accept: (visitor: Visitor) -> void

child_nodes() Показать исходный код
# File lib/prism/node.rb, line 8158
def child_nodes
  [pattern, statements]
end

def child_nodes: () -> Array[nil | Node]

Также псевдоним: deconstruct
comment_targets() Показать исходный код
# File lib/prism/node.rb, line 8171
def comment_targets
  [pattern, *statements, in_loc, *then_loc]
end

def comment_targets: () -> Array[Node | Location]

compact_child_nodes() Показать исходный код
# 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

copy(**params) Показать исходный код
# 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

deconstruct()

def deconstruct: () -> Array[nil | Node]

Псевдоним для: child_nodes
deconstruct_keys(keys) Показать исходный код
# 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]

in() Показать исходный код
# File lib/prism/node.rb, line 8195
def in
  in_loc.slice
end

def in: () -> String

inspect(inspector = NodeInspector.new) Показать исходный код
# 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

then() Показать исходный код
# File lib/prism/node.rb, line 8200
def then
  then_loc&.slice
end

def then: () -> String?

END_OF_DOCUMENT_MARKER
type() Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API