Не удалось достичь желаемого с помощью аргументов ключевого слова:
class MyClass
attr_reader :num1, :num2, :num3
def initialize(n1: nil, n2: nil, n3: nil)
if n2.nil?
puts 'num2 is nil'
end
if n3.nil?
puts 'num3 is nil'
end
@num1 = n1 || 0
@num2 = n2 || 0
@num3 = n3 || 0
end
end
MyClass.new(n1: 1, n2: 3)
# num3 is nil
# => <MyClass:0x0... @num1=1, @num2=3, @num3=0>
MyClass.new(n1: 4, n3: 1)
# num2 is nil
# => <MyClass:0x0... @num1=4, @num2=0, @num3=1>
Аргументы ключевых слов доступны начиная с ruby 2.0. Google или посмотрите, например, здесь для получения дополнительной информации об аргументах ключевых слов.
Если вы хотите оставаться близким к синтаксису MyClass (), вы можете настроить его следующим образом:
class MyClass
attr_reader :num1, :num2, :num3
def initialize(n1 = 0, n2 = 0, n3 = 0)
@num1 = n1
@num2 = n2
@num3 = n3
end
def self.call(n1: nil, n2: nil, n3: nil)
if n2.nil?
puts 'num2 is nil'
end
if n3.nil?
puts 'num3 is nil'
end
new n1, n2, n3
end
end
MyClass.(n1: 1, n2: 3)
# num3 is nil
# => <MyClass:0x0... @num1=1, @num2=3, @num3=nil>
MyClass.(n1: 4, n3: 1)
# num2 is nil
# => <MyClass:0x0... @num1=4, @num2=nil, @num3=1>
Обратите внимание на '.'после имени класса.
Еще одна альтернатива - использовать def self.[](...)
вместо def self.call(...)
, а ваши вызовы использовать MyClass[...]
(без точки после класса).