2013-08-10 6 views
4

Я видел специфический запах кода с параметрами по умолчанию. То есть, когда метод имеет значение по умолчанию, заданное для одного из его параметров, но вызывающий абонент пропускает nil вместо того, чтобы не передавать значение. В большинстве случаев это происходит потому, что вызывающий имеет хэш и пытается передать определенное значение из хэша. В частности:Передача отсутствующих параметров

def foo(params) 
    ... 
    bar(params[:first], params[:second]) # :second doesn't exist 
end 

def bar(first, second = 2) 
end 

Вторые пары в foo не не стали значением по умолчанию, но становится nil. Наиболее распространенным способом я видел это обрабатывается в том, что первая строка в функции бара:

second ||= 2 

Есть ли лучший способ обработки этого? То есть, всякий раз, когда nil или никакие параметры не передаются, присвойте значение по умолчанию.

ответ

8
def bar(first, second = 2) 

Это устанавливает second к 2, если аргумент опущен. nil - значение со значением, поэтому передается nil, поскольку значение аргумента явно указывается как nil. Это специально, поэтому вы можете переопределить значение по умолчанию nil, если хотите.

Если вы хотите, чтобы ваш аргумент присвоил значение по умолчанию, если оно опущено, или nil, то ||= - это идиоматический способ сделать это.

def bar(first, second = nil) 
    second ||= 2 
    puts second 
end 

bar 1  #=> 2 
bar 1, 3 #=> 3 
bar 1, nil #=> 2 

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

Это не ведет себя так универсально, потому что когда-то вы хотите заменить аргумент по умолчанию nil. И способ работы по умолчанию позволяет вам сделать именно это.

Смежные вопросы