В Ruby там способ перегрузить инициализировать конструктора?

У меня была та же проблема. Я нашел самый простой способ использовать enableWriteAheadLogging () в объекте базы данных.

databaseObject.enableWriteAheadLogging()
68
задан agentbanks217 18 October 2010 в 11:38
поделиться

1 ответ

Вы могли использовать двойной оператор ** нащельной рейки в сочетании с [1 115] логичный или (двойные каналы) || внутренняя часть initialize метод для достижения того же эффекта.

class Person
  def initialize(**options)
    @name = options[:name] || options[:first_name] << ' ' << options[:last_name]
  end
end

james = Person.new(name: 'James')
#=> #<Person @name="James">

jill_masterson = Person.new(first_name: 'Jill', last_name: 'Masterson')
#=> #<Person @name="Jill Masterson">

Однако, если новое Person будет создано без first_name, то добавление << операция перестанет работать с NoMethodError: undefined method '<<' for nil:NilClass. Вот пересмотренное initialize метод для обработки этого случая (использующий strip для удаления пробел, если любой опция исключена).

class Person
  def initialize(**options)
    @name = options[:name] || [ options[:first_name] , options[:last_name] ].join(' ').strip
  end
end

goldfinger = Person.new(last_name: 'Goldfinger')
#=> #<Person @name="Goldfinger">

oddjob = Person.new(first_name: 'Oddjob')
#=> #<Person @name="Oddjob">

На самом деле, этот подход дескрипторы, звоня Person.new без аргументов или с неожиданным ключом для возврата нового экземпляра с [1 113] набор к пустой строке:

nameless = Person.new
#=> <#Person @name="">

middle_malcom = Person.new(middle_name: 'Malcom')
#=> <#Person @name="">
0
ответ дан 24 November 2019 в 14:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: