Pergunta

Python, C ++, do esquema e outros, todos permitem definir funções que recebem um número variável de argumentos no final da lista de argumentos ...

def function(a, b, *args):
    #etc...

... que pode ser chamado como se segue:

function(1, 2)
function(1, 2, 5, 6, 7, 8)

etc ... Existem linguagens que permitem que você faça funções variádicos com a lista de argumentos em outro lugar? Algo parecido com isto:

def function(int a, string... args, int theend) {...}

Com todos estes válido:

function(1, 2)
function(1, "a", 3)
function(1, "b", "c", 4)

Além disso, o que acontece com argumentos opcionais em qualquer lugar na lista de argumentos?

def function(int a, int? b, int c, int... d) {}

function(1, 2) //a=1, c=2, b=undefined/null/something, d=[]
function(1,2,3) //a=1, b=2, c=3,d=[]
function(1,2,3,4,5) //a=1, b=2, c=3, d=[4,5]
Foi útil?

Solução

As futuras versões do Ruby (1.9 e acima, Ruby 1.9 está programado para lançado no final de janeiro de 2009) pode fazer isso.

No entanto, não é sempre óbvio qual valor é obrigado a qual parâmetro.

Este é o Ruby 1.9 aceita:

0 ou mais argumentos obrigatórios seguido por 0 ou mais argumentos opcionais seguidos por 0 ou mais obrigatórias argumentos seguido por argumentos de descanso seguido por 0 ou mais obrigatórias argumentos.

Exemplo:

def meth mand1, opt1 = :def1, o2 = :d2, *args, m2, m3
  puts %w[mand1 opt1 o2 m2 args m3].inject('') { |s, arg|
    s << "#{arg} = #{(eval arg).inspect}, "
  }.gsub /, $/, ''
end

meth :arg1, :a2, :a3
# => mand1 = :arg1, opt1 = :def1, o2 = :d2, m2 = :a2, args = [], m3 = :a3
meth :arg1, :a2, :a3, :a4
# => mand1 = :arg1, opt1 = :a2, o2 = :d2, m2 = :a3, args = [], m3 = :a4
meth :arg1, :a2, :a3, :a4, :a5
# => mand1 = :arg1, opt1 = :a2, o2 = :a3, m2 = :a4, args = [], m3 = :a5
meth :arg1, :a2, :a3, :a4, :a5, :a6
# => mand1 = :arg1, opt1 = :a2, o2 = :a3, m2 = :a5, args = [:a4], m3 = :a6
meth :arg1, :a2, :a3, :a4, :a5, :a6, :a7
# => mand1 = :arg1, opt1 = :a2, o2 = :a3, m2 = :a6, args = [:a4, :a5], m3 = :a7

Como você pode ver, os argumentos obrigatórios são obrigados primeira, tanto da esquerda quanto da direita. Então argumentos opcionais ficar ligado e se os argumentos estão sobrando, eles são empacotados em um array e ligado ao argumento de descanso.

Outras dicas

O próximo C ++ pode fazer isso com a seguinte sintaxe:

void f(int a, std::initializer_list<int> b, int c) {
    // b.begin(), b.end(), b.size() allow to access them
}

void g() { 
    f(1, { 2, 3, 4, 5 }, 2);
}

BASIC teve este para idades.

Por exemplo:

LOCATE [row%] [,[column%] [,[cursor%] [,start% [,stop%]]]]

Este comando define a posição (linha%, coluna%) do cursor, bem como especificar o tamanho do cursor (iniciar%, parada%) e se é realmente visível (cursor%). Aqui, tudo entre colchetes pode ser omitido, e se for, que a propriedade não é alterado.

Um exemplo de uso:

LOCATE , 5

Para mudar a coluna 5, ou

LOCATE 1, , 0

para passar para a primeira linha e fazer o cursor invisível.

Outro comando, onde este se vê é o comando PUT para gravar em arquivos. Se o argumento do meio (o arquivo buscar posição) é omitido, em seguida, escrevendo ocorre logo após a gravação anterior.

É importante salientar, argumento omissão só é visto em built-in declarações, e não procedimentos definidos pelo usuário e funções.

Em termos de implementação, isto é o que a Microsoft Basic Compiler (BC) parece estar a fazer para uma chamada para localizar:

  1. Para cada argumento:
    • Se um argumento for omitido, empurrão 0
    • Se um argumento é fornecido, empurre 1 e empurre o valor real
  2. Empurre o argumento count
  3. Chame a função de biblioteca

Vários idiomas (Perl, Python, muitos outros) podem fazer argumentos nomeados, que são semelhante a fazer argumentos opcionais em qualquer lugar na lista de parâmetros ... (Os parâmetros nomeados podem aparecer em qualquer ordem, e qualquer um deles pode ser feita opcional ...) eles não são estritamente o mesmo, mas eles estão perto ...

Não tenho certeza varargs, embora eles geralmente pode ser substituído por um objeto de matriz / hash de / list ...

parâmetros-chave do Lisp pode ser o que você está procurando. Acho que há um arranjo semelhante em Ruby. Veja também parâmetros da função do Lisp visão geral .

Suponho contagem PHP. Você pode fazer isso para simular o que você está procurando. Pessoalmente, acho que seria confuso embora.

function foo() {
    $args = func_get_args(); // returns an array of args
}

R (a linguagem estatística) tem também, e ele pode estar no meio da lista, mas há semântica sutis.

http: // cran .R-project.org / doc / manuais / R-intro.html # A-três-pontos-argumento

> f1 <- function(x,...,y) {  return(x+y) }
> f1(1,2)
Error in f1(1, 2) : argument "y" is missing, with no default
> f1(1,y=2)
[1] 3
> f1 <- function(x,...,y) {  return(x+y) }
> f1(1,2)
Error in f1(1, 2) : argument "y" is missing, with no default
> f1(1,y=2)
[1] 3
> 

É chamado Argumentos de descanso e isso pode ser feito pelo menos em C ++ e Java. Google "Argumentos de descanso" e você vai encontrar um monte de dados sobre o assunto com alguns exemplos como funções que passarão números e retornar uma média de entrada de números, talvez o mínimo ou máximo de todos os números passaram. Como você pode ver, há uma série de usos para esses recursos, eu usei-o em código para inputing dados MYSQL então quando eu quiser adicionar uma linha, eu só adicionar o nome tabela como a primeira corda eo resto são todos coluna nomes e, em seguida, seus dados sem ter que sentar lá e manualmente fazê-lo uma e outra vez. Boa sorte!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top