Почему эти параметры по умолчанию определены как есть? - PullRequest
2 голосов
/ 24 мая 2009

В настоящее время я изучаю Ruby и RoR и наткнулся на это объявление:

link_to_remote(name, options = {}, html_options = nil) 

Я обнаружил, что этот шаблон используется в нескольких других функциях Rails.

Почему значения по умолчанию определены таким образом? Почему не один из этих двух?

... options = {}, html_options = {}) 
... options = nil, html_options = nil) 

Это какое-то соглашение, которому я должен следовать в своих собственных функциях?

Ответы [ 2 ]

1 голос
/ 24 мая 2009

Метод определяется следующим образом:

link_to_function(name, remote_function(options), html_options || options.delete(:html))

Это позволяет вам указать html_options как часть хеша options вместо отдельного параметра. С другой стороны, хэш options всегда передается в remote_function, поэтому он нам нужен.

Также немного эффективнее использовать singleton nil, а не создавать массив, который никогда не будет использоваться при каждом вызове метода. Я бы не сказал, что эта причина настолько убедительна, что я не стал бы использовать {}, если бы она сделала полученный код чище, но в отсутствие каких-либо других соображений это кажется логичным.

0 голосов
/ 24 мая 2009

Не эксперт по этому вопросу, но для options это может быть связано с тем, что вызывающий код использует метод merge для объединения того, что вы передаете, с предполагаемыми значениями по умолчанию; установка nil просто удалит все опции. Я не уверен насчет html_options, но это может быть что-то подобное.

html_options может вызвать блок и определить что-то, чтобы проверить, есть ли у него хэш или нет. Как я уже сказал, я не эксперт, но может быть поэтому. Я только что проверил на Ubuntu VM и, согласно irb, пустой хэш оценивается как true, поэтому может быть поэтому. Код вызова, вероятно, использует блок со строкой:

if html_options
    # do stuff
end

так что nil по умолчанию, потому что код будет выполняться и, вероятно, даст вам нулевую ошибку с пустым Hash

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...