이 루비 코드에서 (단항) * 연산자는 무엇을합니까?


174

루비 코드가 주어지면

line = "first_name=mickey;last_name=mouse;country=usa" 
record = Hash[*line.split(/=|;/)] 

나는 *운영자 와는 별개로 두 번째 줄의 모든 것을 이해 합니다. (당신이 짐작할 수 있듯이,이 사건을 찾는 것이 어렵다는 것을 증명합니다 ...)

답변:


271

*은 IS 플랫 연산자.

Array인수 목록,이 경우 Hash.[]메소드 에 대한 인수 목록으로 확장합니다 . (더 정확하게 말하면 to_ary/에 응답하는 모든 객체 to_a또는 to_aRuby 1.9 를 확장합니다 .)

설명을 위해 다음 두 문장은 동일합니다.

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

메소드 정의에서 나머지 모든 메소드 인수를 포착하기 위해 다른 컨텍스트에서 사용될 수도 있습니다. 이 경우 확장되지 않지만 다음을 결합하십시오.

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

여기에 더 자세한 정보가 있습니다 .


36
일반적으로 LHS와 같은 상황에서 (값을 호출 할 때마다) 사용하면 splat은 배열을 별도의 값으로 분할하고 RHS와 같은 상황에서 사용하는 경우 (사용할 때마다) 이전에 정의되지 않은 일부 변수에서는 별도의 값을 배열로 그룹화합니다. 따라서 a,b,*c = d,e,f,*ga = d, b = e 및 c = [f, g0, g1, g2, ..., gn]을 설정합니다. 여기서 g = [g0, g1, g2, ..., gn]
rampion

2
완전성을 위해, splat 연산자는 David A. Black의 'The Well Grounded Rubyist'에 사용 된 용어에 따라 배열을 기본 목록으로 바꿉니다.
David Burrows

12
@rampion : 멋진 의견입니다. LHS와 RHS를 혼합했습니다. 그것은 다른 길입니다.
ThomasH

46

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

그게 다야!


6

모두가 언급했듯이, 그것은 "표시"입니다. 루비 구문을 찾는 것은 불가능하며 다른 질문에서 이것을 물었습니다. 질문의 해당 부분에 대한 답변은

asterisk in ruby syntax

구글에서. Google은 당신을 위해 있습니다. 당신이 보는 것을 말로 표현하십시오.

많은 루비 코드와 마찬가지로 그 코드는 매우 밀도가 높습니다. 그만큼

line.split(/=|;/)

SIX 요소의 배열을 만듭니다 first_name, mickey, last_name, mouse, country, usa. 그런 다음 스 플랫을 사용하여 해시로 만듭니다. 이제 Ruby 사람들은 모든 것이 Ruby에 노출되어 있기 때문에 항상 Splat 메소드를 보도록 보냅니다. 나는 그것이 어디에 있는지 모른다. 그러나 일단 당신이 그것을 가지고 나면 for, 배열을 통해 실행 하고 해시를 빌드하는 것을 보게 될 것이다 .

핵심 문서 에서 코드를 찾으십시오 . 찾을 수 없다면 (나는 할 수 없다), 다음과 같은 코드를 작성하려고 시도 할 것이다 (작동하지만 루비와 같은 코드는 아님).

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["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}

따라서 귀하의 예에서 이것은 다음 해시로 이어질 것입니다.

{"first_name"=>"mickey", "last_name"=>"mouse", "county"=>"usa"}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.