Si defino un Ruby funciona así:
def ldap_get ( base_dn, filter, scope=LDAP::LDAP_SCOPE_SUBTREE, attrs=nil )
¿Cómo puedo llamarlo suministrando solo los primeros 2 y los últimos args? ¿Por qué no es algo como
ldap_get( base_dn, filter, , X)
posible o si es posible, ¿cómo se puede hacer?
ruby
optional-parameters
Bruno Antunes
fuente
fuente
scope
verdadero y lo transfierafalse
,scope ||= true
no funcionará. Evalúa lo mismonil
y lo configurará comotrue
xyz||=true
. Dice que si es nulo, siempre es cierto. Si es verdad, es verdad.scope ||= true
es, me sorprende que nadie haya mencionado que la mejor manera de hacerlo es conscope = LDAP::LDAP_SCOPE_SUBTREE if scope.nil?
. Por supuesto, incluso eso supone quenil
es un valor no válido.nil
. A algunos les puede gustar la notación:ldap_get(base_dn, filter, _, X)
(nota: no sé (todavía) cuándo se introdujo en Ruby. Interesante hilo SO ).Casi siempre es mejor usar un hash de opciones.
fuente
options = default_options.merge(options)
El tiempo pasó y, desde la versión 2, Ruby admite parámetros con nombre:
fuente
No es posible hacerlo de la manera que has definido
ldap_get
. Sin embargo, si defineldap_get
así:Ahora usted puede:
Pero ahora tiene un problema que no puede llamarlo con los dos primeros argumentos y el último argumento (el mismo problema que antes pero ahora el último argumento es diferente).
La razón de esto es simple: no se requiere que cada argumento en Ruby tenga un valor predeterminado, por lo que no puede llamarlo de la manera que ha especificado. En su caso, por ejemplo, los dos primeros argumentos no tienen valores predeterminados.
fuente
1) No puede sobrecargar el método ( ¿por qué Ruby no admite la sobrecarga del método? ) Entonces, ¿ por qué no escribir un método nuevo por completo?
2) Resolví un problema similar usando el operador splat * para una matriz de longitud cero o más. Entonces, si quiero pasar un parámetro o parámetros que puedo, se interpreta como una matriz, pero si quiero llamar al método sin ningún parámetro, entonces no tengo que pasar nada. Consulte las páginas 186/187 del lenguaje de programación Ruby .
fuente
Recientemente encontré una forma de evitar esto. Quería crear un método en la clase de matriz con un parámetro opcional, para mantener o descartar elementos en la matriz.
La forma en que simulé esto fue pasando una matriz como parámetro y luego comprobando si el valor en ese índice era nulo o no.
Probar nuestro método de clase con diferentes parámetros:
salida:
["1", "2", "a", "b", "c"]
Bien, genial, eso funciona según lo planeado. Ahora revisemos y veamos qué sucede si no pasamos la opción del tercer parámetro (1) en la matriz.
salida:
["a", "b", "c"]
Como puede ver, la tercera opción en la matriz se ha eliminado, iniciando así una sección diferente en el método y eliminando todos los valores ASCII que no están en nuestro rango (32-126)
Alternativamente, podríamos haber emitido el valor como nulo en los parámetros. Que se vería similar al siguiente bloque de código:
fuente
Es posible :) Simplemente cambie la definición
a
alcance estará ahora en matriz en su primer lugar. Cuando proporcione 3 argumentos, entonces habrá asignado base_dn, filter y attrs y param_array será [] Cuando 4 y más argumentos entonces param_array será [argumento1, or_more, y_more]
Lo malo es ... no es una solución clara, realmente fea. Esto es para responder que es posible omitir argumentos en el medio de la llamada a la función en ruby :)
Otra cosa que debe hacer es reescribir el valor predeterminado del alcance.
fuente
attrs=nil
) después de un splat (*param_array
).¶meter
, pero en Ruby 1.9 también podía ser seguido por "parámetros ordinarios". En ninguno de los casos fue un parámetro con un valor legal predeterminado después de un parámetro con un splat.Podría hacerlo con una aplicación parcial, aunque el uso de variables con nombre definitivamente conduce a un código más legible. John Resig escribió un artículo de blog en 2008 sobre cómo hacerlo en JavaScript: http://ejohn.org/blog/partial-functions-in-javascript/
Probablemente sería posible aplicar el mismo principio en Ruby (a excepción de la herencia prototípica).
fuente