2012-12-26 127 views
1

爲什麼這段代碼潑濺在參數位置

Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten] 

回報這個

{:first_name=>"Shane", :last_name=>"Harvie"} 

我知道Array#flatten。但是*是什麼意思?我如何查找關於它的信息?

回答

5

它所謂的圖示操作。在這種情況下,它需要一個數組並將其「擴展」,產生一個參數列表以調用Hash.[]。基本上

Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten] 

相當於該

Hash[*[:first_name, 'Shane', :last_name, 'Harvie']] 

這相當於這個

Hash[:first_name, 'Shane', :last_name, 'Harvie'] 
+0

我如果你表現出這種想法會更好在應用splat操作符之前應用「flatten」之後的步驟。 – sawa

+0

@sawa:我認爲你是對的。編輯。 –

2

一個簡單的圖示操作例子,除了Sergio的答案:

def foo(arg1, arg2) 
    puts arg1 
    puts arg2 
end 
args = ["bar", "baz"] 

foo(args) 
#=> ArgumentError: wrong number of arguments (1 for 2) 

foo(*args) 
#=> "bar" 
#=> "baz"