2011-03-09 16 views
11

Estoy usando Ruby on Rails 3 y me gustaría saber qué significa la presencia de un operador * cerca de un argumento de función y comprender sus usos en otros escenarios.¿Qué hace el símbolo * (asterisco) cerca de un argumento de función y cómo usar eso en otros escenarios?

Ejemplo escenario (este método era desde el rubí en los carriles 3 marco):

def find(*args) 
    return to_a.find { |*block_args| yield(*block_args) } if block_given? 

    options = args.extract_options! 

    if options.present? 
    apply_finder_options(options).find(*args) 
    else 
    case args.first 
    when :first, :last, :all 
     send(args.first) 
    else 
     find_with_ids(*args) 
    end 
    end 
end 

Respuesta

34

Este es el operador de splat, que proviene de ruby ​​(y por lo tanto no es específico de los rieles). Se puede aplicar de dos maneras dependiendo de donde se utiliza:

  • a "paquete" una serie de argumentos en una matriz
  • para dividir una matriz en una lista de argumentos

En su función, verá el operador splat utilizado en la definición de la función. El resultado es que la función acepta cualquier cantidad de argumentos. La lista de argumentos completa se colocará en args como una matriz.

def foo(*args) 
    args.each_with_index{ |arg, i| puts "#{i+1}. #{arg}" } 
end 

foo("a", "b", "c") 
# 1. a <== this is the output 
# 2. b 
# 3. c 

La segunda variante sería si tenemos en cuenta el siguiente método:

def bar(a, b, c) 
    a + b + c 
end 

Se requiere exactamente tres argumentos. Ahora puede llamar a este método como sigue

my_array = [1, 2, 3] 
bar(*my_array) 
# returns 6 

El splat aplicado en este caso a la matriz se dividirá y pasar cada elemento de la matriz como un parámetro individual al método. Se podría hacer lo mismo, incluso llamando foo:

foo(*my_array) 
# 1. 1 <== this is the output 
# 2. 2 
# 3. 3 

Como se puede ver en su método de ejemplo, estas reglas no se aplican a bloquear los parámetros de la misma manera.

2

Este es un argumento splat, que básicamente significa que ningún argumento 'extra' pasados ​​al método todos serán asignados a * args.

Cuestiones relacionadas