2011-03-09 1 views
11

Ruby on Rails 3을 사용하고 있는데, 어떤 함수 인수 근처에 * 연산자가 있는지 의미하고 다른 시나리오에서 그 사용법을 이해하고 있다는 것을 알고 싶습니다.* (별표) 기호는 함수 인수 근처에서 무엇을합니까? 그리고 다른 시나리오에서이를 사용하는 방법은 무엇입니까?

예 시나리오는 (이 방법은 레일에 루비 3 프레임 워크에서했다) :

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 

답변

34

이것은 루비에서 비롯된 splat 연산자입니다 (따라서 레일 특정이 아닙니다). 그것은 그것이 사용되는 위치에 따라 두 가지 방법으로 적용 할 수 있습니다

  • 에 "팩"
  • 인수 목록

에서에 배열을 분할하는 배열 인수의 수 함수에 함수 정의에 사용 된 splat 연산자가 표시됩니다. 그 결과 함수는 여러 개의 인수를 허용합니다. 전체 인수 목록은 args에 배열로 저장됩니다.

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

그것은 정확히 세 개의 인수가 필요합니다 다음과 같은 방법을 고려할 때

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 

두 번째 변종이 될 것입니다.

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

을 분할 방법과 개별 파라미터로서 배열의 각 요소를 통과 할 배열이 경우에 적용되는 플랫을 다음과 같이 이제이 메소드를 호출 할 수있다. 당신은 foo를 호출하여 동일한 기능을 수행 할 수 있습니다 : 당신이 당신의 방법의 예에서 볼 수 있듯이,이 규칙은 같은 방법으로 매개 변수를 차단

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

적용 않습니다.

2

이 기본적으로 메서드에 전달 '추가'인수가 모두 할당된다는 것을 의미 플랫 인수이며, * args.