Se eu definir um Ruby funciona assim:
def ldap_get ( base_dn, filter, scope=LDAP::LDAP_SCOPE_SUBTREE, attrs=nil )
Como posso chamá-lo de fornecer apenas os dois primeiros e os últimos argumentos? Por que não é algo como
ldap_get( base_dn, filter, , X)
possível ou se for possível, como isso pode ser feito?
ruby
optional-parameters
Bruno Antunes
fonte
fonte
scope
verdadeiro e passafalse
,scope ||= true
não funcionará. Ele avalia o mesmonil
e o definirá comotrue
xyz||=true
. Está dizendo que se é nulo, é sempre verdade. Se é verdade, é verdade.scope ||= true
é, fico surpreso que ninguém tenha mencionado que a melhor maneira de fazer isso éscope = LDAP::LDAP_SCOPE_SUBTREE if scope.nil?
. Obviamente, mesmo isso assumindo quenil
é um valor inválido.nil
. Alguns podem gostar da notação:ldap_get(base_dn, filter, _, X)
(nota: eu ainda não sei) quando isso foi introduzido no Ruby. Segmento SO interessante ).Você quase sempre está melhor usando um hash de opções.
fonte
options = default_options.merge(options)
O tempo mudou e, desde a versão 2, o Ruby suporta parâmetros nomeados:
fonte
Não é possível fazer isso da maneira que você definiu
ldap_get
. No entanto, se você definirldap_get
assim:Agora você pode:
Mas agora você tem um problema que não pode chamar com os dois primeiros argumentos e o último argumento (o mesmo problema de antes, mas agora o último argumento é diferente).
A lógica para isso é simples: todos os argumentos do Ruby não precisam ter um valor padrão, portanto você não pode chamá-lo da maneira que especificou. No seu caso, por exemplo, os dois primeiros argumentos não têm valores padrão.
fonte
1) Você não pode sobrecarregar o método ( por que o ruby não suporta sobrecarga de método? ); Por que não escrever um novo método completamente?
2) Resolvi um problema semelhante usando o operador splat * para uma matriz de zero ou mais comprimentos. Então, se eu quiser passar um parâmetro, posso interpretá-lo como uma matriz, mas se eu quiser chamar o método sem nenhum parâmetro, não preciso passar nada. Consulte Ruby Programming Language, páginas 186/187
fonte
Recentemente eu encontrei uma maneira de contornar isso. Eu queria criar um método na classe array com um parâmetro opcional, para manter ou descartar elementos no array.
A maneira como simulei isso foi passando uma matriz como parâmetro e depois verificando se o valor naquele índice era nulo ou não.
Experimentando nosso método de classe com diferentes parâmetros:
resultado:
["1", "2", "a", "b", "c"]
Ok, legal, que funciona como planejado. Agora vamos verificar e ver o que acontece se não passarmos a terceira opção de parâmetro (1) na matriz.
resultado:
["a", "b", "c"]
Como você pode ver, a terceira opção na matriz foi removida, iniciando uma seção diferente no método e removendo todos os valores ASCII que não estão em nosso intervalo (32-126)
Como alternativa, poderíamos ter emitido o valor nulo nos parâmetros. O que seria semelhante ao seguinte bloco de código:
fonte
É possível :) Basta alterar a definição
para
o escopo estará agora em ordem em primeiro lugar. Quando você fornece 3 argumentos, você atribui base_dn, filter e attrs e param_array será [] Quando 4 ou mais argumentos, então param_array será [argument1, or_more e_more]
A desvantagem é ... não é uma solução clara, muito feia. Isso é para responder que é possível omitir argumentos no meio da chamada de função em ruby :)
Outra coisa que você precisa fazer é reescrever o valor padrão do escopo.
fonte
attrs=nil
) após um splat (*param_array
).¶meter
, mas no Ruby 1.9, ele também podia ser seguido por "parâmetros comuns". Em nenhum dos casos houve um parâmetro com um padrão legal depois de um parâmetro com um splat.Você pode fazer isso com aplicação parcial, embora o uso de variáveis nomeadas definitivamente leve a um código mais legível. John Resig escreveu um artigo de blog em 2008 sobre como fazê-lo em JavaScript: http://ejohn.org/blog/partial-functions-in-javascript/
Provavelmente seria possível aplicar o mesmo princípio em Ruby (exceto a herança prototípica).
fonte