Если я определю функции Ruby следующим образом:
def ldap_get ( base_dn, filter, scope=LDAP::LDAP_SCOPE_SUBTREE, attrs=nil )
Как я могу назвать это предоставлением только первых двух и последних аргументов? Почему не что-то вроде
ldap_get( base_dn, filter, , X)
возможно или, если возможно, как это сделать?
ruby
optional-parameters
Бруно Антунес
источник
источник
scope
true и вы переходитеfalse
,scope ||= true
не сработает. Он оценивает то же самоеnil
и будет устанавливать его наtrue
xyz||=true
. Он говорит, что если это ноль, это всегда правда. Если это правда, это правда.scope ||= true
, я удивлен, что никто не упомянул, что лучший способ сделать это - использоватьscope = LDAP::LDAP_SCOPE_SUBTREE if scope.nil?
. Конечно, даже это предполагаетnil
недопустимое значение.nil
. Некоторым может понравиться обозначение:ldap_get(base_dn, filter, _, X)
(примечание: я не знаю (пока), когда это было введено в Ruby. Интересная тема SO ).Практически всегда лучше использовать хеш опций.
источник
options = default_options.merge(options)
Время прошло, и начиная с версии 2 Ruby поддерживает именованные параметры:
источник
Это невозможно сделать так, как вы определили
ldap_get
. Однако, если вы определитеldap_get
так:Теперь вы можете:
Но теперь у вас есть проблема, что вы не можете вызвать его с первыми двумя аргументами и последним аргументом (та же проблема, что и раньше, но теперь последний аргумент другой).
Обоснование этого простое: каждый аргумент в Ruby не обязательно должен иметь значение по умолчанию, поэтому вы не можете называть его указанным вами способом. В вашем случае, например, первые два аргумента не имеют значений по умолчанию.
источник
1) Вы не можете перегрузить метод ( почему Ruby не поддерживает перегрузку метода? ), Так почему бы вообще не написать новый метод?
2) Я решил аналогичную проблему с помощью оператора splat * для массива нулевой или большей длины. Затем, если я хочу передать параметр (ы), который я могу, он интерпретируется как массив, но если я хочу вызвать метод без какого-либо параметра, мне не нужно ничего передавать. См. Страницы языка программирования Ruby 186/187.
источник
Недавно я нашел способ обойти это. Я хотел создать метод в классе массива с необязательным параметром, чтобы сохранять или отбрасывать элементы в массиве.
Я смоделировал это, передав массив в качестве параметра, а затем проверив, было ли значение в этом индексе нулем или нет.
Пробуем использовать наш метод класса с разными параметрами:
вывод:
["1", "2", "a", "b", "c"]
Ладно, круто, работает как задумано. Теперь давайте проверим и посмотрим, что произойдет, если мы не передадим третий параметр (1) в массив.
вывод:
["a", "b", "c"]
Как вы можете видеть, третий вариант в массиве был удален, тем самым инициировав другой раздел в методе и удалив все значения ASCII, которые не находятся в нашем диапазоне (32-126)
В качестве альтернативы мы могли указать в параметрах значение nil. Это будет похоже на следующий блок кода:
источник
Возможно :) Просто измените определение
в
область видимости теперь будет в массиве на первом месте. Когда вы указываете 3 аргумента, вам будут назначены base_dn, filter и attrs, а param_array будет [] Если 4 и более аргументов, тогда param_array будет [argument1, or_more, and_more]
Обратной стороной является ... непонятное решение, действительно некрасивое. Это ответ на то, что в ruby можно опустить аргумент в середине вызова функции :)
Еще одна вещь, которую вам нужно сделать, это переписать значение по умолчанию для области видимости.
источник
attrs=nil
) после splat (*param_array
) является синтаксической ошибкой .¶meter
, но в Ruby 1.9 за ним также могли следовать «обычные параметры». Ни в том, ни в другом случае параметр с допустимым значением по умолчанию не был после параметра со знаком.Вы можете сделать это с частичным приложением, хотя использование именованных переменных определенно приводит к более читаемому коду. Джон Ресиг в 2008 году написал в блоге статью о том, как это сделать в JavaScript: http://ejohn.org/blog/partial-functions-in-javascript/
Вероятно, можно было бы применить тот же принцип в Ruby (за исключением прототипного наследования).
источник