Было бы плохой практикой иметь метод, который возвращает self
для block_given?
и другой тип, если блок не был предоставлен?
Пример:
Config#item
вернет item
, если блок не задан, и вернет Config
, если он задан.
class Item
:attr_reader :key
def initialize(key)
@key = key
end
def do_stuff
puts "#{key} doing some stuff"
self
end
end
class Config
attr_reader :items
def initialize
@items = {}
end
def item(key)
itm = @items[key] ||= Item.new(key)
if block_given?
yield(itm)
self
else
itm
end
end
end
Использование:
cnf = Config.new
cnf.item("foo") do |itm|
itm.do_stuff
end
.item("bar") do |itm|
itm.do_stuff
end
foo = .item("foo").do_stuff
cnf.item("baz").do_stuff
foo.do_stuff
Модель предназначена для использования того же метода item
, что и для получения, и для ссылки на элемент, который необходимо настроить или какую конфигурацию необходимо открыть.