2013-11-22 1 views
0

У меня есть следующий метод класса, который не использует классы по умолчанию, если не предусмотрено:Как передавать объекты в метод класса

def self.make_sandwich(bread = Bread, butter = Butter, cheese = Cheese) 
    ... 
end 

Так что я могу назвать его и передать новый класс хлеба под названием MyBread

[class].make_sandwich(MyBread) 

Но как я могу пропустить хлеб и сыр без масла? Я знаю, что могу изменить заказ или использовать attr_accessor для использования класса по умолчанию, если он не указан, но предположим, что я не могу изменить этот код таким образом.

ответ

2

Если вы на рубине 2.0, вы можете использовать keyword arguments.

Если вы используете старый рубин, вы можете использовать параметр хеш-опций.

def self.make_sandwich(opts = {:bread => Bread, 
           :butter => Butter, 
           :cheese => Cheese}) 

    bread_to_use = opts[:bread] 
end 

make_sandwich(:bread => some_bread, 
       :cheese => some_cheese) 

В качестве альтернативы, вы можете установить значения по умолчанию в теле метода, а затем просто передать nil в вызове метода.

def self.make_sandwich(bread = nil, butter = nil, cheese = nil) 
    bread ||= Bread 
    butter ||= Butter 
    cheese ||= Cheese 
    ... 
end 

make_sandwich(bread, nil, cheese) 
Смежные вопросы