2009-05-27 1 views

답변

217

*splat 연산자입니다.

Array을 인수 목록으로 확장합니다 (이 경우 Hash.[] 메서드에 대한 인수 목록). . (보다 정확하게는,이 루비 1.9 to_ary/to_a 또는 to_a 응답 개체를 확장)

을 설명하기 위해 다음의 두 문장은 동일하다 :

method arg1, arg2, arg3 
method *[arg1, arg2, arg3] 

또한 사용될 수있다 다른 컨텍스트에서 메서드 정의의 나머지 메서드 인수를 모두 catch합니다. 이 경우 확장되지 않고 결합됩니다.

def method2(*args) # args will hold Array of all arguments 
end 

Some more detailed information here.

+33

일반적으로 LHS와 같은 상황 (값으로 호출 할 때마다)으로 사용하면 splat은 배열을 별도의 값으로 나눕니다. RHS와 같은 상황에서 사용하면 이전에 정의되지 않은 변수에서 사용), 별도의 값을 배열로 그룹화합니다. 그러므로, a = d, b = e, c = [f, g0, g1, g2, ..., gn]을 g = G0, g1, g2, ..., gn] – rampion

+0

대단한 대답, 명확하고 상세한 감사합니다 –

+2

단지 완성도를 위해, splat 연산자는 데이비드의 'The Well Grounded Rubyist'에 사용 된 용어에 따라 배열을 베어리스트로 바꿉니다. A. Black –

34

splat 연산자는 함수에 전달 된 배열을 압축 해제하여 각 요소가 개별 매개 변수로 함수에 전송되도록합니다.

간단한 예 : 그거야

>> def func(a, b, c) 
>> puts a, b, c 
>> end 
=> nil 

>> func(1, 2, 3) #we can call func with three parameters 
1 
2 
3 
=> nil 

>> list = [1, 2, 3] 
=> [1, 2, 3] 

>> func(list) #We CAN'T call func with an array, even though it has three objects 
ArgumentError: wrong number of arguments (1 for 3) 
    from (irb):12:in 'func' 
    from (irb):12 

>> func(*list) #But we CAN call func with an unpacked array. 
1 
2 
3 
=> nil 

!

4

모두가 언급했듯이, "스 플랫"입니다. Ruby 구문을 찾는 것은 불가능하며 다른 질문에서이 질문을했습니다. 그 부분에 대한 대답은

asterisk in ruby syntax 

Google에서 검색한다는 것입니다. 구글이 당신을 위해 존재합니다.

Anyhoo는 많은 Ruby 코드와 마찬가지로 매우 코드 밀도가 높습니다.

line.split(/=|;/) 

여섯 개 요소 first_name, mickey, last_name, mouse, country, usa 배열을 만든다. 그런 다음 해골을 해시로 만드는 데 사용됩니다. 이제 루비 사람들은 항상 당신에게 Splat 메소드를 보냅니다. 모든 것이 루비에 노출되어 있기 때문입니다. 나는 그것이 어디 있는지 전혀 모르지만, 일단 그것을 가지고 있다면 배열을 통해 for을 실행하고 해시를 빌드하는 것을 볼 수 있습니다.

코드는 core 설명서에서 찾을 수 있습니다. 당신은 (나는 할 수 없었다)을 찾을 수없는 경우, 당신은이 같은 일부 코드를 작성하려고 (작동하지만, 루비와 같은 코드가 아닙니다) 것 :

line = "first_name=mickey;last_name=mouse;country=usa" 
presplat = line.split(/=|;/) 
splat = Hash.new 
for i in (0..presplat.length-1) 
    splat[presplat[i]] = presplat[i+1] if i%2==0 
end 

puts splat["first_name"] 

다음 루비 갱 알 수있을 것입니다 왜 코드가 어리 석고, 나쁘고, 또는 보통 잘못 되었습니까?

여기까지 읽으신 분은 Hash 설명서를 읽어 보시기 바랍니다.이 설명서에서는 표시를 설명하지 않지만 알아야합니다.