класс Prism::CallOrWriteNode
Представляет использование оператора ‘||=` в вызове.
foo.bar ||= value ^^^^^^^^^^^^^^^^^
Атрибуты
attr_reader call_operator_loc: Location?
attr_reader message_loc: Location?
attr_reader operator_loc: Location
attr_reader receiver: Node?
attr_reader value: Node
attr_reader write_name: Symbol
Публичные методы класса
# File lib/prism/node.rb, line 2537 def initialize(flags, receiver, call_operator_loc, message_loc, read_name, write_name, operator_loc, value, location) @flags = flags @receiver = receiver @call_operator_loc = call_operator_loc @message_loc = message_loc @read_name = read_name @write_name = write_name @operator_loc = operator_loc @value = value @location = location end
def initialize: (flags: Integer, receiver: Node?, call_operator_loc: Location?, message_loc: Location?, read_name: Symbol, write_name: Symbol, operator_loc: Location, value: Node, location: Location) -> void
# File lib/prism/node.rb, line 2670 def self.type :call_or_write_node end
Аналогично type, этот метод возвращает символ, который вы можете использовать для разделения по типу узла, не выполняя длинную цепочку ===. Обратите внимание, что, как и type, он всё равно будет медленнее, чем использование == для одного класса, но должен быть быстрее в операторе case или сравнении массивов.
def self.type: () -> Symbol
Методы публичного экземпляра
# File lib/prism/node.rb, line 2550 def accept(visitor) visitor.visit_call_or_write_node(self) end
def accept: (visitor: Visitor) -> void
# File lib/prism/node.rb, line 2606 def attribute_write? flags.anybits?(CallNodeFlags::ATTRIBUTE_WRITE) end
def attribute_write?: () -> bool
# File lib/prism/node.rb, line 2611 def call_operator call_operator_loc&.slice end
def call_operator: () -> String?
# File lib/prism/node.rb, line 2555 def child_nodes [receiver, value] end
def child_nodes: () -> Array[nil | Node]
# File lib/prism/node.rb, line 2568 def comment_targets [*receiver, *call_operator_loc, *message_loc, operator_loc, value] end
def comment_targets: () -> Array[Node | Location]
# File lib/prism/node.rb, line 2560 def compact_child_nodes compact = [] compact << receiver if receiver compact << value compact end
def compact_child_nodes: () -> Массив
# File lib/prism/node.rb, line 2573
def copy(**params)
CallOrWriteNode.new(
params.fetch(:flags) { flags },
params.fetch(:receiver) { receiver },
params.fetch(:call_operator_loc) { call_operator_loc },
params.fetch(:message_loc) { message_loc },
params.fetch(:read_name) { read_name },
params.fetch(:write_name) { write_name },
params.fetch(:operator_loc) { operator_loc },
params.fetch(:value) { value },
params.fetch(:location) { location },
)
end def copy: (**params) -> CallOrWriteNode
# File lib/prism/node.rb, line 2591
def deconstruct_keys(keys)
{ flags: flags, receiver: receiver, call_operator_loc: call_operator_loc, message_loc: message_loc, read_name: read_name, write_name: write_name, operator_loc: operator_loc, value: value, location: location }
end def deconstruct_keys: (keys: Массив) -> Hash[Symbol, nil | Node | Массив | String | Token | Массив | Location]
# File lib/prism/node.rb, line 2626
def inspect(inspector = NodeInspector.new)
inspector << inspector.header(self)
flags = [("safe_navigation" if safe_navigation?), ("variable_call" if variable_call?), ("attribute_write" if attribute_write?)].compact
inspector << "├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n"
if (receiver = self.receiver).nil?
inspector << "├── receiver: ∅\n"
else
inspector << "├── receiver:\n"
inspector << receiver.inspect(inspector.child_inspector("│ ")).delete_prefix(inspector.prefix)
end
inspector << "├── call_operator_loc: #{inspector.location(call_operator_loc)}\n"
inspector << "├── message_loc: #{inspector.location(message_loc)}\n"
inspector << "├── read_name: #{read_name.inspect}\n"
inspector << "├── write_name: #{write_name.inspect}\n"
inspector << "├── operator_loc: #{inspector.location(operator_loc)}\n"
inspector << "└── value:\n"
inspector << inspector.child_node(value, " ")
inspector.to_str
end def inspect(inspector: NodeInspector) -> String
# File lib/prism/node.rb, line 2616 def message message_loc&.slice end
def message: () -> String?
# File lib/prism/node.rb, line 2621 def operator operator_loc.slice end
def operator: () -> String
def safe_navigation?: () -> bool
# File lib/prism/node.rb, line 2660 def type :call_or_write_node end
Иногда вам нужно проверить экземпляр узла на соответствие списку классов, чтобы определить, какое поведение выполнить. Обычно это делается с помощью вызова `[cls1, cls2].include?(node.class)` или размещения узла в операторе case и выполнения `case node; when cls1; when cls2; end`. Оба этих подхода относительно медленные из-за постоянных поисков, вызовов методов и/или выделения массивов.
Вместо этого вы можете вызвать type, который вернёт вам символ, который можно использовать для сравнения. Это быстрее, чем другие подходы, потому что использует одно целочисленное сравнение, но также потому, что если вы работаете с CRuby, вы можете использовать тот факт, что операторы case со всеми символьными ключами будут использовать таблицу переходов.
def type: () -> Symbol
# File lib/prism/node.rb, line 2601 def variable_call? flags.anybits?(CallNodeFlags::VARIABLE_CALL) end
def variable_call?: () -> bool
Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.