2013-05-14 2 views
0

Первый вариант метода:Являются ли эти два метода Ruby эквивалентными хэш-параметрами? Если нет, почему бы и нет?

def method(param1, param2={}) 
    meth_x(param2).meth_y(param1) 
    meth_z 
    #... 
end 

Второй вариант метода (обратите внимание на второй param2) ...

def method(param1, param2={}) 
    meth_x(param2={}).meth_y(param1) 
    meth_z 
    #... 
end 

Я хотел бы предположить, что эти два метода эквивалентны, и, таким образом, я бы идти с первым (меньше набрав, меньше избыточности).

Тем не менее, мне любопытно, если от них следовало бы вести себя по-другому, и если да, то почему.

+0

Есть ли причина, по которой вы думаете, что они могут вести себя по-другому? –

+0

Я получаю неопределенные заявления от других разработчиков моей команды о различиях в поведении - хотя на данный момент я скептически отношусь к ним. :-) –

ответ

3

Во втором случае вы устанавливаете param2 на пустой хеш, прежде чем указывать его как параметр meth_x. В определении метода param2 = {} означает, что если параметр опущен, то он установлен на этот пустой пустой хэш, но в meth_x(param2 = {}) означает, что вы отбрасываете исходное содержимое param2 и заменяете его пустым хешем, а затем даете ему meth_x ,

irb(main):001:0> a = {:alma => 2} 
=> {:alma=>2} 
irb(main):002:0> puts a 
{:alma=>2} 
=> nil 
irb(main):003:0> puts(a) 
{:alma=>2} 
=> nil 
irb(main):004:0> puts(a = {}) 
{} 
=> nil 
+1

Итак, во втором случае param2 всегда будет * пустым хешем? –

+0

Я имею в виду, * эффективно * всегда будет пустой хеш, независимо от того, что передается методу #method? –

+0

Yepp, это путь. Еще лучше, если остальная часть 'метода'' param2' будет содержать это новое значение. Если вы хотите инициализировать его на пустой хеш, если он «nil», используйте «meth_x (param2 || = {})» или 'meth_x (param2 || {})'. Таким образом, исходный контент не будет потерян. Но поскольку вы используете значение параметра по умолчанию в определении метода, это не может быть так. – Matzi

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