Обычно имеется в виду аргумент вызова Person.new(...), который стандартный механизм new передаёт в initialize для настройки нового объекта. initialize может принимать обязательные, необязательные, позиционные и ключевые параметры. Class.new — другой вызов: он создаёт новый класс. При смешивании параметров *rest записывают до ключевых аргументов.
Что означает аргумент при создании объекта класса в Ruby?
Как ClassName.new передаёт параметры в initialize, чем позиционные аргументы отличаются от ключевых и где расположен splat.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Выражение «аргумент для класса» неточно: аргументы передают методу. В типичном случае речь о вызове Person.new(...), который выделяет объект и вызывает его initialize с переданными аргументами. Они задают начальное состояние:
class Person
attr_reader :name, :age
def initialize(name, age: nil)
@name = name
@age = age
end
end
person = Person.new("Anna", age: 30)
puts person.name # Anna
Здесь name — обязательный позиционный параметр, а age — ключевой с значением по умолчанию. Не следует путать Person.new с Class.new: второй создаёт объект нового класса, которому при необходимости задают суперкласс.
Более общий пример сочетания параметров:
class Example
attr_reader :arguments
def initialize(required, optional = "default", *rest, mode: "normal")
@arguments = [required, optional, rest, mode]
end
end
p Example.new(1, 2, 3, 4, mode: "custom").arguments
# [1, 2, [3, 4], "custom"]
Позиционные аргументы идут перед ключевыми; *rest собирает оставшиеся позиционные значения. Для произвольных ключевых аргументов используют **options. Отсутствие обязательного аргумента или неизвестный ключ при строгой сигнатуре приводит к ArgumentError.
Отдельный возвращаемый результат initialize не становится результатом new: стандартный new возвращает созданный экземпляр. Для ясного интерфейса обычно лучше несколько понятных параметров, чем длинный неструктурированный список. Параметры методов Ruby, Class.